这篇读书笔记,主要记录我阅读《OpenCV3编程入门》的读书笔记,作者毛星云写的这本书十分适合接触OpenCV的初学者,虽然理论性的内容是简要概括,但还是可以大致的理解。。此书最好的就是提供了大量的完整例子的代码,对初学者入门相当有帮助,建议各位OpenCV的初学者可以认真阅读一下这本书,会对OpenCV的编程有个一个整体的初步认识。
OpenCV学习笔记
1.using namespace cv; //包含cv命名空间
2.Mat srcImage = ("1.jpg"); //载入图像
3.imshow("[原始图]",srcImage);//显示图像
4.waitKey(0); //等待任意按键按下
5.waitKey(6000); //等待6000ms后窗口自动关闭
6.blur(srcImage,dstImage,Size(7,7)); //均值滤波操作
7. cvtColor(srcImage, grayImage, CV_BGR2GRAY ); //将原图像转换为灰度图像
8.读入视频
法一:VideoCapturecapture("1.avi");
法二:VideoCapturecapture; capture.open("1.avi");
9. 调用摄像头读入视频
VideoCapture capture(0);
chap2. 启程前的认知准备
chap3. HighGUI图形用户界面初步
1.OpenCV中的C++类和函数都是定义在命名空间cv之内的,所以在代码开头 的位置加上using namespacecv; 这句代码。
2.Mat类是用于保存图像以及其他矩阵数据的数据结构,默认尺寸为0
3. 图像的载入:Matimread(const string& filename, int flags=1);第一个参数conststring& filename指的是载入图片的路径名;第二个参数int flags是载入标识符,指定一个夹在图像的类型,默认为1,flags>0返回3通道彩色图像,flags=0返回灰度图像,flags<0返回Alpha通道的加载图像。
4.图像的显示:imshow(conststring& winname, InputArray mat);第一个参数指的是要显示窗口标识名称;第二个参数填要显示的图像。
5. 创建窗口namedWindow
namedWindow(cosnt string& winname, int flags=WINDOW_AUTOSIZE);
第一个参数填写被用作窗口标识符的窗口名称;第二个参数窗口的标识,可以填如下几种值:WINDOW_NORMAL用户可以改变窗口的大小,WINDOW_AUTOSIZE设置这个值(为默认值),窗口大小会自动调整以适应所显示的图像,且用户没法手动改变窗口大小。
6. 输出图像到文件imwrite()函数
imwrite(cosntstring& filename, InputArray img, const vector<int>¶ms=vecror<int>() );
第一个参数,填需要的写入的文件名,要带上后缀,如“123.jpg”;第二个参数,一般填一个Mat类型的图像数据;第三个参数,表示特定格式保存的参数编码,默认值vecror<int>()
7.创建滑动条:creatTrackbar()函数
creatTrackbar( conststring& trackbarname, conststring& winname, int* value, intcount, TrackbarCallback onChange=0, void* userdata=0)
第一个参数,trackbarname,轨迹条的名字;
第二个参数,winname,窗口的名字,表示轨迹条依附到的窗口;
第三个参数,value,指向整形的指针,表示滑块的位置,创建时滑块的初始位置就是该变量当前的值;
第四个参数,count,表示滑块可以达到的最大位置的值;
第五个参数,onChange,指向回调函数的指针,滑块位置改变,这个函数都进行回调,且这个函数的原型必须为voidXXXX(int, void*),第一个参数是轨迹条的位置,第二个参数是用户数据。若回调是NULL指针,则表示没有回调函数的作用,仅第三个参数value有变化;
第六个参数,userdata,默认值0。
chap4. OpenCV数据结构与基本绘图
1.使用函数clone()或者copyTo() 来复制一幅图像的矩阵
Mat F= A.clone(); Mat G; A.copyTo(G)
2. 矩形的表示:Rect类
Rect类的成员有x,y,width,height,分别为左上角点的坐标和矩形的宽、高。
contains(Point)判断点是否在矩形内;
inside(Rect)判断矩形是否在该矩形内;
tl()返回左上角点坐标; br()返回右下角点坐标
3.颜色空间转换:cvtColor()函数
cvtColor(InputArraysrc, OutputArray dst, int code, int dstCn=0)
第一个参数,输入图像;
第二个参数,输出图像;
第三个参数,颜色空间转换的标识符;
第四个参数,目标图像的通道数,若为0,则表示其取源图像的通道数。
4. 创建空白的Mat图像
MatatomImage=Mat::zeros( 长, 宽, CV_8UC3 );
5.OpenCV默认的图片通道存储顺序是BGR,即蓝绿红,而不是RGB
chap5. core组件进阶
1. 按原始图的参数规格来创建创建效果图
MatsrcImage = imread("1.jpg");
Mat dstImage;
dstImage.create(srcImage.rows,srcImage.cols,srcImage.type());//效果图的大小、类型与原图片相同
2.计时函数 getTickCount()和getTickFrequency()
//记录起始时间
doubletime0 = static_cast<double>(getTickCount());
//计算运行时间并输出
time0= ((double)getTickCount() - time0)/getTickFrequency();
cout<<"\t此方法运行时间为:"<<time0<<"秒"<<endl; //输出运行时间
3.Mat类的公有成员变量cols和rows给出了图像的宽和高
srcImage.rows
srcImage.cols
4.Mat类的成员函数channels()用于返回图像的通道数;
灰度图的通道数为1,彩色图的通道数为3.
5. Mat类提供ptr函数得到图像任意行的首地址
uchar*data = outputImage.ptr<uchar>(i); //获取第i行的首地址
6.访问图像中的像素P100-114
7. 感兴趣区域(ROI,regionof interest)
两种方法定义ROI:
第一种,用表示矩形区域的Rect,它指定矩形的左上角坐标和矩形的长宽
MatimageROI;
imageROI=image(Rect(500,250,logo.cols,logo.rows));
第二种,指定感兴趣行或者列的范围(Range),Range是指从起始索引到终止索引(不包括终止索引)的一连段连续序列。
imageROI=image(Range(250,250+logoImage.rows),Range(200,200+logoImage.cols))
8. MatimageROI=image(Rect(500,250,logo.cols,logo.rows));
Matmask=imread("logo.jpg",0);//加载掩膜&