c++实现运动目标的追踪

一、头文件

命名空间: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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值