C++中的Mat类是OpenCV库中最核心的数据结构之一,用于表示图像和矩阵等二维、三维数据。Mat类的主要特点是可轻松地访问像素点,支持各种矩阵运算,可以实现各种图像处理算法。下面是一些常见的Mat操作:
1. 创建Mat对象:可以通过构造函数、静态方法或赋值操作符来创建Mat对象,例如:
cv::Mat mat1; //创建空的Mat对象
cv::Mat mat2(100, 200, CV_8UC3); //创建大小为100x200,类型为CV_8UC3的Mat对象
cv::Mat mat3 = cv::Mat::zeros(200, 300, CV_8UC1); //创建大小为200x300,类型为CV_8UC1,像素值为0的Mat对象
cv::Mat mat4 = cv::imread("test.jpg"); //从文件中读取图像,返回一个Mat对象
2. 访问像素点:可以通过at()方法或指针方式访问Mat对象中的像素点,例如:
int value1 = mat1.at<int>(row, col); //获取Mat对象中(row, col)处的像素值
uchar value2 = mat2.ptr<uchar>(row)[col * 3]; //获取Mat对象中(row, col)处的B通道的像素值(类型为CV_8UC3)
3. 修改像素点:可以通过at()方法或指针方式修改Mat对象中的像素点,例如:
mat1.at<int>(row, col) = value1; //将Mat对象中(row, col)处的像素值设为value1
mat2.ptr<uchar>(row)[col * 3] = value2; //将Mat对象中(row, col)处的B通道的像素值(类型为CV_8UC3)设为value2
4. 访问Mat对象的属性:可以通过rows、cols和type等属性访问Mat对象的大小和类型,例如:
int rows = mat1.rows; //获取Mat对象的行数
int cols = mat2.cols; //获取Mat对象的列数
int type = mat3.type(); //获取Mat对象的像素类型
5. 矩阵运算:可以利用Mat对象进行各种矩阵运算,例如:
cv::Mat mat5 = mat2 * 2; //将Mat对象中所有像素值乘以2
cv::Mat mat6 = mat2 + mat3; //将两个Mat对象中的像素值相加
cv::Mat mat7 = mat3.t(); //将Mat对象转置
6. 通道分离和合并:可以将多通道的Mat对象分离成单通道的Mat对象,或将多个单通道的Mat对象合并成多通道的Mat对象,例如:
std::vector<cv::Mat> channels;
cv::split(mat2, channels); //将Mat对象的三个通道分离成三个Mat对象
cv::merge(channels, mat2); //将三个Mat对象合并成一个Mat对象
7. 图像缩放:可以通过resize()方法对Mat对象进行缩放,例如:
cv::Mat dst;
cv::resize(src, dst, cv::Size(200, 100)); //将src Mat对象缩放为大小为200x100的dst Mat对象
8. 图像平移:可以通过warpAffine()方法对Mat对象进行平移,例如:
cv::Mat dst;
cv::Mat M = (cv::Mat_<float>(2,3) << 1, 0, 50, 0, 1, 100); //定义平移矩阵
cv::warpAffine(src, dst, M, src.size()); //进行平移操作,输出结果保存在dst Mat对象中
9. 图像旋转:可以通过warpAffine()方法对Mat对象进行旋转,例如:
cv::Mat dst;
cv::Point2f center(src.cols/2.0, src.rows/2.0); //定义旋转中心
cv::Mat M = cv::getRotationMatrix2D(center, 45, 1.0); //定义旋转矩阵
cv::warpAffine(src, dst, M, src.size()); //进行旋转操作,输出结果保存在dst Mat对象中
10. 图像翻转:可以通过flip()方法对Mat对象进行翻转,例如:
cv::Mat dst;
cv::flip(src, dst, 1); //将src Mat对象水平翻转,输出结果保存在dst Mat对象中
11. 图像膨胀和腐蚀:可以通过dilate()和erode()方法对Mat对象进行膨胀和腐蚀操作,例如:
cv::Mat dst1, dst2;
cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3,3)); //定义膨胀和腐蚀时的结构元素
cv::dilate(src, dst1, kernel); //对src Mat对象进行膨胀操作,输出结果保存在dst1 Mat对象中
cv::erode(src, dst2, kernel); //对src Mat对象进行腐蚀操作,输出结果保存在dst2 Mat对象中
12. 直方图均衡化:可以通过equalizeHist()方法对Mat对象进行直方图均衡化操作,用于改善图像对比度,例如:
cv::Mat dst;
cv::equalizeHist(src, dst); //对src Mat对象进行直方图均衡化操作,输出结果保存在dst Mat对象中
13. 高斯滤波:可以通过GaussianBlur()方法对Mat对象进行高斯滤波操作,用于去噪和平滑图像,例如:
cv::Mat dst;
cv::GaussianBlur(src, dst, cv::Size(3,3), 0); //对src Mat对象进行高斯滤波操作,输出结果保存在dst Mat对象中
14. Canny边缘检测:可以通过Canny()方法对Mat对象进行Canny边缘检测操作,例如:
cv::Mat dst;
cv::Canny(src, dst, 50, 150); //对src Mat对象进行Canny边缘检测操作,输出结果保存在dst Mat对象中
15. Hough变换:可以通过HoughLines()和HoughCircles()方法对Mat对象进行Hough变换,用于检测直线和圆等形状,例如:
std::vector<cv::Vec2f> lines;
cv::HoughLines(dst, lines, 1, CV_PI/180, 100); //对dst Mat对象进行Hough直线检测操作,输出结果保存在lines中
std::vector<cv::Vec3f> circles;
cv::HoughCircles(dst, circles, CV_HOUGH_GRADIENT, 1, src.rows/8, 200, 100, 0, 0); //对dst Mat对象进行Hough圆检测操作,输出结果保存在circles中
16. 分水岭算法:可以通过distanceTransform()、threshold()和watershed()方法对Mat对象进行分水岭算法,用于图像分割,例如:
cv::Mat dst, binary, distance;
cv::distanceTransform(src, distance, cv::DIST_L2, 3); //对src Mat对象进行距离变换,输出结果保存在distance Mat对象中
cv::threshold(distance, binary, 0.7 * cv::norm(distance), 255, cv::THRESH_BINARY); //对distance Mat对象进行二值化,输出结果保存在binary Mat对象中
cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3,3));
cv::morphologyEx(binary, binary, cv::MORPH_OPEN, kernel); //对binary Mat对象进行形态学开运算
cv::Mat markers(binary.size(), CV_8U, cv::Scalar(0));
markers = binary + 1;
cv::watershed(src, markers); //对src Mat对象进行分水岭算法,输出结果保存在markers Mat对象中