OPenCV_摄像头视频捕获并画矩形框

1#include "stdafx.h" 2#include "opencv2/imgproc/imgproc.hpp" 3#include <opencv2/highgui/highgui.hpp> 4#include <opencv2/core/core.hpp> 5#include <stdio.h> 6#include <iostream> 7using namespace cv; 8using namespace std; 9Rect select; 10bool select_flag=false; 11Point origin; 12Mat frame; 13/************************************************************************************************************************/ 14/****                    如果采用这个onMouse()函数的话,则只能画出从左上到右下,或者从右下到左上的矩形框                    ****/ 15/************************************************************************************************************************/ 16//void onMouse(int event,int x,int y,int,void*) 17//{ 18//    if(event==CV_EVENT_LBUTTONDOWN) 19//    { 20//        select.x=x; 21//        select.y=y; 22//        tracking=false; 23//    } 24//    else if(event==CV_EVENT_LBUTTONUP) 25//    { 26//        select.width=x-select.x;//以下2行计算出来的值要么都大于0,要么都小于0 27//        select.height=y-select.y; 28//        tracking=true;//左键完后,开始跟踪 29//    } 30//} 31/************************************************************************************************************************/ 32/****                            如果采用这个onMouse()函数的话,则可以画出鼠标拖动矩形框的4种情形                        ****/ 33/************************************************************************************************************************/ 34void onMouse(int event,int x,int y,int,void*) 35{ 36    //Point origin;//不能在这个地方进行定义,因为这是基于消息响应的函数,执行完后origin就释放了,所以达不到效果。 37    if(select_flag) 38    { 39        select.x=MIN(origin.x,x);//不一定要等鼠标弹起才计算矩形框,而应该在鼠标按下开始到弹起这段时间实时计算所选矩形框 40        select.y=MIN(origin.y,y); 41        select.width=abs(x-origin.x);//算矩形宽度和高度 42        select.height=abs(y-origin.y); 43        select&=Rect(0,0,frame.cols,frame.rows);//保证所选矩形框在视频显示区域之内 44    } 45    if(event==CV_EVENT_LBUTTONDOWN) 46    { 47        select_flag=true;//鼠标按下的标志赋真值 48        origin=Point(x,y);//保存下来单击是捕捉到的点 49        select=Rect(x,y,0,0);//这里一定要初始化,宽和高为(0,0)是因为在opencv中Rect矩形框类内的点是包含左上角那个点的,但是不含右下角那个点 50    } 51    else if(event==CV_EVENT_LBUTTONUP) 52    { 53        select_flag=false; 54    } 55} 56int main(int argc, unsigned char* argv[]) 57{ 58    char c; 59    //打开摄像头 60    VideoCapture cam(0); 61    if (!cam.isOpened()) 62        return -1; 63    //建立窗口 64    namedWindow("camera",1);//显示视频原图像的窗口 65    //捕捉鼠标 66    setMouseCallback("camera",onMouse,0); 67    while(1) 68    { 69        //读取一帧图像 70        cam>>frame; 71        if(frame.empty()) 72            return -1; 73        //画出矩形框 74        rectangle(frame,select,Scalar(255,0,0),3,8,0);//能够实时显示在画矩形窗口时的痕迹 75        //显示视频图片到窗口 76        imshow("camera",frame); 77    //    select.zeros(); 78        //键盘响应 79        c=(char)waitKey(20); 80        if(27==c)//ESC键 81            return -1; 82    } 83    return 0; 84}
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )