OPENCV系列博客主要记录自己学习OPENCV的历程,以及存储已经实现的代码,以备后续回顾使用,代码中包含了主要的备注。
Mat类型的使用方法
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc, char**argv) {
//Mat1. 创建Mat对象,并且从文件中读取图片显示
Mat src;
src = imread("sample.jpg");
if (src.empty()) {
cout << "The image is empty,plz check the file route..." << endl;
return -1;
}
namedWindow("Original_image", CV_WINDOW_AUTOSIZE);
imshow("Original_image",src);
//Mat2. 复制图像1: 创建Mat对象,复制src对象的尺寸,并且赋值给指定颜色(指定尺寸的纯色图)
Mat dst;
dst = Mat(src.size(), src.type());//设置图片尺寸,图片类型
dst = Scalar(127,0,255); //设置纯色图片
namedWindow("Test1", CV_WINDOW_AUTOSIZE);
imshow("Empty_Image_test", dst);
//Mat3. 复制图像2: 使用src.clone指令,复制已有图片到新建的图片中
Mat dst = src.clone();
namedWindow("Test1", CV_WINDOW_AUTOSIZE);
imshow("Empty_Image_test", dst);
//Mat4. 复制图像3: src.copyTo指令,将图片复制到dst中
Mat dst;
src.copyTo(dst);
namedWindow("Test1", CV_WINDOW_AUTOSIZE);
imshow("Empty_Image_test", dst);
//Mat5. 复制图像4: 在复制图像的同时,修改图像的格式
Mat dst;
cvtColor(src, dst, CV_BGR2GRAY);
namedWindow("Test1", CV_WINDOW_AUTOSIZE);
imshow("Empty_Image_test", dst);
printf("The input image channel is : %d \n",src.channels());
printf("The output image channel is : %d \n", dst.channels());
//Mat6. 显示图像信息(行,列,像素强度)
Mat dst;
cvtColor(src, dst, CV_BGR2GRAY);
namedWindow("Test1", CV_WINDOW_AUTOSIZE);
imshow("Empty_Image_test", dst);
int cols = dst.cols; //获取行和列的信息
int rows = src.rows;
printf("The row number of the image is : %d \n", cols);
printf("The column number of the image is : %d \n", rows);
const uchar* firstrow_strangth = dst.ptr<uchar>(0); //!!! 使用指针,取出第一行第一个元素的强度值
printf("The strength is : %d \n", *firstrow_strangth); //!!!
//Mat7.Mat 构造函数-创建一个用于测试的数值矩阵
//重要!! 这个方法可以用于进行程序测试,运行处理程序,检查每个元素的强度是否与设定的一致; 之后再使用真实图片测试,这样比较直观。
Mat M(3,3,CV_8UC3,Scalar(0,0,255)); //(3x3;每个通道8位,U表示无符号,C表示char类型,3表示通道数是3;每个像素的值是多少(0,0,255))
cout << "M=" << endl << M << endl;
//Mat8.Mat 定义一个小数组----掩膜,并用掩膜进行滤波-提高对比度
Mat csrc;
Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
filter2D(src, csrc, -1, kernel);
namedWindow("csrc", CV_WINDOW_AUTOSIZE);
imshow("csrc", csrc);
//Mat9.Mat Trick: 创建一个与给定图片尺寸一致的图片:纯黑色
//Mat dst = Mat::zeros(src.size(),src.type());
Mat dst = Mat::eye(2,2,CV_8UC1);
namedWindow("black", CV_WINDOW_AUTOSIZE);
imshow("black", dst);
waitKey();
return 0;
}
上边代码运行时需要注释掉其他不需要的内容,运行效果如下:
->关于如何使用Mat指针获取特定像素值的方法
常用形式:
mat.ptr<type>(row)[col]
对于Mat的ptr函数,返回的是<>中的模板类型指针,指向的是()中的第row行的起点
通常<>中的类型和Mat的元素类型应该一致
然后再用该指针去访问对应col列位置的元素
以下转载自:https://blog.csdn.net/github_35160620/article/details/51708659
单通道
cv::Mat image = cv::Mat(400, 600, CV_8UC1); //定义了一个Mat变量image。
uchar * data00 = image.ptr<uchar>(0); //data00是指向image第一行第一个元素的指针。
uchar * data10 = image.ptr<uchar>(1); //data10是指向image第二行第一个元素的指针。
uchar * data01 = image.ptr<uchar>(0)[1];//data01是指向image第一行第二个元素的指针。
多通道
cv::Mat image = cv::Mat(400, 600, CV_8UC3); //宽400,长600,3通道彩色图片
cv::Vec3b * data000 = image.ptr<cv::Vec3b>(0);
cv::Vec3b * data100 = image.ptr<cv::Vec3b>(1);
cv::Vec3b * data001 = image.ptr<cv::Vec3b>(0)[1];
cv::Vec3b * data