第1章 图像编程入门
1.1 简介
1.2 安装OpenCV库
1.3 装载、显示和存储图像
- imread——读图像
- namedWindow——定义窗口
- imshow——显示图像
- flip——翻转图像
- waitKey——等待按键
- imwrite——存储图像
- setMouseCallback——响应鼠标在图像上的点击操作
- circle、ellipse、line、rectangle——在图像上绘画对应形状
- putText——在图像上写入文本
1.4 深入了解cv::Mat
- Mat::create——重新分配一个新图像
- Mat::copyTo——把图像复制给另外一个图像
- Mat::convertTo——转换图像数据类型
1.5 定义兴趣区域
- 方法一:
c++ cv::Mat imageROI(image, cv::Rect(image.cols-logo.cols, //ROI坐标 image.rows-logo.rows, logo.cols,logo.rows)); //ROI大小 logo.copyTO(imageROI); //插入标志
- 所谓ROI其实就是Mat类的一种构造函数产生的对原图像内存的新的引用,使用Rect来定义ROI区域时,前两个参数为ROI区域的左上角坐标,后两个参数表示ROI的行列大小。
- 方法二:
c++ cv::Mat imageROI(image, cv::Range(image.rows-logo.rows, logo.rows) //ROI行范围 cv::Range(image.rows-logo.rows, logo.rows)); //ROI列范围 logo.copyTO(imageROI); //插入标志
- 第二种方法是给出行列坐标的起始和终止范围
- 图像掩码 OpenCV中有些操作可以定义掩码,掩码必须为8位图像,如果掩码中某个位置的值不为0,则在这个位置上的操作就会起作用;如果掩码中的某些像素位置的值为0,那么对图像中的相应位置的操作将不起作用;OpenCV中大多数基于像素的操作都可以使用掩码。
第2章 操作像素
2.1 简介
2.2 访问像素值
- Mat::at(row,col)[n]——对8-bit图像而言,单通道图像时,T=uchar,[n]不需要;当为三通道时,T=cv::Vec3b,[n]可以是0、1、2。
2.3 用指针扫描图像
- Mat::ptr(row)——T为图像数据类型,此方法是把图像看成三维立体的来访问,row对应的不是单纯的行,更准确的说是三维立体的层。
- 低层次指针算法访问行:
c++ uchar *data = image.data; data += image.step; //从一行移到下一行
2.4 用迭代器扫描图像
- cv::MatIterator_ it
- cv::Mat_::iterator it
c++ cv::Mat_<cv::Vec3b>::iterator it_begin = image.begin<cv::Vec3b>(); //获得起始位置 cv::Mat_<cv::Vec3b>::iterator it_end = image.end<cv::Vec3b>(); //获得结束位置
2.5 编写高效的图像扫描循环
- cv::getTickCount——返回从最近一次电脑开机到当前的时钟周期数
- cv::getTickFrequency——返回每秒的时钟周期数,获得某个函数(或代码段)的运行时间的方法如下:
c++ const int64 start = cv::getTickCount(); function(); //调用的函数 double duration = (cv::getTickCount()-start) / //经过的时间(s) cv::getTickFrequency()
结果表明:Mat::at<typename T>(row,col)[n]方法应该在