一、头文件
命名空间:using namespace cv;
一般来说OpenCV2,使用哪一模块的内容就添加哪一模块的头文件,例如: 1、如果使用了Mat类,属于core模块。 那么头文件就是#include <opencv2/core/core.hpp> 2、如果使用了imread()或者imshow()函数输入与显示图像进行图形用户交互。 那么头文件就是#include <opencv2/highgui/highgui.hpp> 但是有一种更直接的方法,就是只是用使用头文件#include <opencv2/opencv.hpp>,为什么可以这样子用呢?因为OpenCV2所有模块的hpp文件都是包含在了opencv2文件夹内的。 但是要注意的是,如果直接使用头文件#include <opencv2/opencv.hpp>,每次编译程序时,会加载所有模块,有些模块是你不需要的,浪费时间,降低代码性能。 因此,对于新手,建议先使用头文件#include <opencv2/opencv.hpp>,这样不会因为头文件的问题苦恼,代码能运行就好了,这点时间还不算什么大事。而对于使用了一段时间OpenCV的程序员,此时,需要提高程序的性能,节省代码的处理时间,建议使用各个模块的头文件,也方便熟悉opencv的各个模块内容。
二、相关知识
1.基础
Mat img=imread("F:/picture/tp1.jpg"); namedWindow("showimg", WINDOW_NORMAL); imshow("showimg", img); waitKey(0);
Mat是一个数据结构,用来存图像,应该是用于存储像素点。
imread是读取图像的命令 里面的地址可以是单“/”也可以是双“\\”。
imshow("窗口名",上面定义的Mat结构名)用来展示图片
但是会发现展示的图片闪现一瞬间就会消失,那么用waitKey(0)来暂停,里面的其它参数,据说是用来控制输入一个键盘命令之后等待多长时间后会响应,具体内容需要时再进行查询。
同时还会发现图片被放大了,面积比较大的图片显示的不全,那么就用到namedwindow("窗口名—和imshow中的相同",WINDOW_NORMAL);如此就可以显示全面。
2、opencv调用摄像头
(1)调用视频/摄像头
调用视频/摄像头也需要一个类:videocapture 名字(参数)
参数如果是数字那么就代表摄像头,0代表电脑的内部摄像头,如果电脑有外部摄像头有一个编号为1,两个为1、2依次类推,数字就代表了几号摄像头,还可以是地址,就代表了所输入地址的视频。
videocapture capture(0);//电脑内部摄像头 videpcapture capture(1);//电脑外接一号摄像头 videocapture capture("F:/视频/jilu.mp4");//当前位置的视频
(2)错误提醒
判断视频是否正确打开
if(!capture.isOpen()) { cout<<"video open is error"<<endl; return 0; }
(3)将视频转化为一帧帧的图片
视频的呈现基础仍旧是图片,所以我们仍要定义图片的数据结构Mat,并将视频的帧逐次传入图片结构并用imshow呈现出来。
注意错误判断和设置退出,waitKey参数里的时间由自己设置即可,10不一定是10s应该是10个单位时间。
Mat frame; while(true)//每循环一次传入一帧 { capture>>frame;//将视频中的一帧传入图片结构frame if(frame.empty())//判断帧传入是否正确 { cout<<"frame is error"<<end; break; } imshow("video",frame); //每10个单位时间读取一次键盘操作,如果读取到esc(ascii=27)那么就退出 if(waitKey(10)==27) { cout<<"esc come then exit"<<endl; break; } }
参考链接:
没有任何技巧的OpenCV运动捕捉教程_哔哩哔哩_bilibili
3.鼠标回调函数
(1)函数原型:
void setMousecallback(const string& winname, MouseCallback onMouse, void* userdata=0)
winname:窗口的名字 onMouse:鼠标响应函数,回调函数。指定窗口里每次鼠标时间发生的时候,被调用的函数指针。 这个函数的原型应该为:
void on_Mouse(int event, int x, int y, int flags, void* param);
userdate:传给回调函数的参数 一般默认为NULL即可
(2)鼠标响应函数
函数原型:
void on_Mouse(int event, int x, int y, int flags, void* param); event是 CV_EVENT_*变量之一,代表鼠标进行的操作事件 x和y是鼠标指针在图像坐标系的坐标(不是窗口坐标系) flags是CV_EVENT_FLAG的组合, param是用户定义的传递到setMouseCallback函数调用的参数。
鼠标操作事件:
event://简单鼠标操作 EVENT_MOUSEMOVE 0 //滑动 EVENT_LBUTTONDOWN 1 //左键点击 EVENT_RBUTTONDOWN 2 //右键点击 EVENT_MBUTTONDOWN 3 //中键点击 EVENT_LBUTTONUP 4 //左键放开 EVENT_RBUTTONUP 5 //右键放开 EVENT_MBUTTONUP 6 //中键放开 EVENT_LBUTTONDBLCLK 7 //左键双击 EVENT_RBUTTONDBLCLK 8 //右键双击 EVENT_MBUTTONDBLCLK 9 //中键双击 flags://也是鼠标操作事件更为复杂的操作 EVENT_FLAG_LBUTTON 10 //左鍵拖曳 EVENT_FLAG_RBUTTON 11 //右鍵拖曳 EVENT_FLAG_MBUTTON 12 //中鍵拖曳 EVENT_FLAG_CTRLKEY 13 //(8~15)按Ctrl不放事件 EVENT_FLAG_SHIFTKEY 14 //(16~31)按Shift不放事件 EVENT_FLAG_ALTKEY 15 //(32~39)按Alt不放事件
该项目中鼠标响应函数涉及的知识点:
①:Point 点的模板类
opencv中Point操作 为了描述图像中的点,opencv中提供了点的模板类,分为2维点模板类Point_和3维点模板类Point3_。Point_通过2维图像平面中的x和y坐标确定点的位置,Point3_通过3维立体图像中的x、y、z坐标确定点的位置。对于点的坐标的类型可以是int、double、float类型,下面是源代码中的定义: typedef Point_ Point2i; typed