此分类用于记录OpenCV的学习,目前随笔中给出的代码都是用C++写的,后面可能会用上Python。
另外学习过程的记录会放在代码块的注释中。
学习资料 OpenCV官方文档
OpenCV读取图像数据并输出
对于OpenCV中的图像,以左上角为(0, 0)点,横轴为x,纵轴为y,即对于图像来说,y表示有多少rows,x表示有多少cols
1 void readAndShow(string path) { 2 string imageName(path); 3 cv::Mat image; 4 // cv::Mat 包括一个矩阵头和一个指向存储像素值区域的指针 5 // Mat的复制 只复制矩阵头和指针 图像数据不会复制成第二份 6 // 类似于 Type *A = B 此时改变B也会改变A 浅拷贝 7 8 // 要复制图像数据时 需要使用一下两种方式 9 // cv::Mat image2 = image.clone(); 10 // A.copyTo(image2) 11 12 //image = imread(imageName, cv::IMREAD_COLOR); // 读取图像文件 13 //image = imread(imageName, cv::IMREAD_GRAYSCALE); 14 image = cv::imread(imageName, cv::IMREAD_COLOR); 15 16 // imread() 第一个参数为图像文件所在路径 第二个参数指定我们所需的图像格式 17 // IMREAD_COLOR (<0)按原样加载图像 18 // IMREAD_GRAYSCALE (0) 加载灰度图像 19 // IMREAD_COLOR (>0) 以RGB格式加载图像 20 21 22 if (image.empty()) { // 读取未成功 23 cout << "Failed read!" << std::endl; 24 return; 25 } 26 27 cv::namedWindow("Display window", cv::WINDOW_AUTOSIZE); // 创建window 参数"Display window"指定窗口名称 28 cv::imshow("Display window", image); // 在窗口显示图片 29 cv::waitKey(0); // 等待一个键盘输入 30 return; 31 }
将读入的彩色图片转化为灰度图片并写入磁盘
1 void showCvtColorAndImwrite(string path) { 2 cv::Mat image; 3 image = cv::imread(path, cv::IMREAD_COLOR); // 读取RGB格式彩色图片 4 5 if (image.empty()) { 6 cout << "Failed read!" << endl; 7 return; 8 } 9 10 cv::namedWindow("RGBColor", cv::WINDOW_AUTOSIZE); 11 cv::imshow("RGBColor", image); 12 cv::waitKey(0); 13 14 // 转换为灰度图片 15 cv::Mat grayImage; 16 cv::cvtColor(image, grayImage, cv::COLOR_BGR2GRAY); 17 // 将彩色图片转化为灰度图片 image为原彩色图片数据 grayImage为转化后存储灰色图片数据的地方 cv::COLOR_BGR2GRAY指示执行怎么样的转换 18 19 cv::namedWindow("grayColor", cv::WINDOW_AUTOSIZE); 20 cv::imshow("grayColor", grayImage); 21 22 cv::imwrite("first_gray.jpg", grayImage); 23 // 将garyImage存储的图片数据写入磁盘 新写入的图片文件名为first_gray.jpg 24 cv::waitKey(0); 25 }
在图像中创建感兴趣区域 ROI
1 int selectROIExample(void) { 2 // 在原读取的图像文件中选取了一个990*990大小的矩阵ROI 并输出 3 cv::Mat image; 4 image = cv::imread("first.jpg", cv::IMREAD_COLOR); 5 6 if (image.empty()) { // 读取未成功 7 cout << "Failed read!" << std::endl; 8 return 0; 9 } 10 11 cv::Mat D(image, cv::Rect(10, 10, 1000, 1000)); 12 // 选取image中左上角为(10, 10)长宽为(1000, 1000)的矩形包含的图像 13 // 即在图像中创建感兴趣区域 ROI 14 15 cv::namedWindow("Test Window!", cv::WINDOW_AUTOSIZE); 16 cv::imshow("Test Window!", image); 17 cv::waitKey(0); 18 cv::imshow("Test Window!", D); 19 cv::waitKey(0); 20 return 0; 21 }
Mat的创建
1 void howToCreateMatSubject() { 2 // Mat的初始化构造 3 4 cv::Mat image(100, 100, CV_8UC3, cv::Scalar(0, 0, 255)); 5 // 通过给定图像大小100*100 6 // 指定存储元素的数据类型和每个矩阵点的通道数CV_8UC3即8位无符号char类型3通道 7 // 通过Scalar将图像设置为单一灰度Scalar(num)或颜色Scalar(n1, n2, n3) 8 9 int size[3] = { 200, 200, 200 }; 10 cv::Mat image2(3, size, CV_8UC(1), cv::Scalar::all(0)); 11 // 创建一个2维已上的矩阵 12 // 参数3指定维度 13 // size 指定每个维度的大小 14 15 /* 16 MATLAB样式的初始化器 17 cv::Mat::zeros() 18 cv::Mat::ones() 19 cv::Mat::eye() 20 */ 21 22 // cv::randu() 获取随机值 23 24 // cv::format()控制输出格式 cv::Formatter::FMT_NUMPY表示以numpy形式 25 // std::cout << "控制输出格式" << std::endl << cv::format(image, cv::Formatter::FMT_NUMPY) << std::endl; 26 27 cv::Point2f P(5, 1); 28 // 点 29 }