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

#include "stdafx.h"
#include "opencv2/imgproc/imgproc.hpp"
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <stdio.h>
#include <iostream>
using namespace cv;
using namespace std;
Rect select;
bool select_flag=false;
Point origin;
Mat frame;
/************************************************************************************************************************/
/****                    如果采用这个onMouse()函数的话,则只能画出从左上到右下,或者从右下到左上的矩形框                    ****/
/************************************************************************************************************************/
//void onMouse(int event,int x,int y,int,void*)
//{
//    if(event==CV_EVENT_LBUTTONDOWN)
//    {
//        select.x=x;
//        select.y=y;
//        tracking=false;
//    }
//    else if(event==CV_EVENT_LBUTTONUP)
//    {
//        select.width=x-select.x;//以下2行计算出来的值要么都大于0,要么都小于0
//        select.height=y-select.y;
//        tracking=true;//左键完后,开始跟踪
//    }
//}
/************************************************************************************************************************/
/****                            如果采用这个onMouse()函数的话,则可以画出鼠标拖动矩形框的4种情形                        ****/
/************************************************************************************************************************/
void onMouse(int event,int x,int y,int,void*)
{
    //Point origin;//不能在这个地方进行定义,因为这是基于消息响应的函数,执行完后origin就释放了,所以达不到效果。
    if(select_flag)
    {
        select.x=MIN(origin.x,x);//不一定要等鼠标弹起才计算矩形框,而应该在鼠标按下开始到弹起这段时间实时计算所选矩形框
        select.y=MIN(origin.y,y);
        select.width=abs(x-origin.x);//算矩形宽度和高度
        select.height=abs(y-origin.y);
        select&=Rect(0,0,frame.cols,frame.rows);//保证所选矩形框在视频显示区域之内
    }
    if(event==CV_EVENT_LBUTTONDOWN)
    {
        select_flag=true;//鼠标按下的标志赋真值
        origin=Point(x,y);//保存下来单击是捕捉到的点
        select=Rect(x,y,0,0);//这里一定要初始化,宽和高为(0,0)是因为在opencv中Rect矩形框类内的点是包含左上角那个点的,但是不含右下角那个点
    }
    else if(event==CV_EVENT_LBUTTONUP)
    {
        select_flag=false;
    }
}
int main(int argc, unsigned char* argv[])
{
    char c;
    //打开摄像头
    VideoCapture cam(0);
    if (!cam.isOpened())
        return -1;
    //建立窗口
    namedWindow("camera",1);//显示视频原图像的窗口
    //捕捉鼠标
    setMouseCallback("camera",onMouse,0);
    while(1)
    {
        //读取一帧图像
        cam>>frame;
        if(frame.empty())
            return -1;
        //画出矩形框
        rectangle(frame,select,Scalar(255,0,0),3,8,0);//能够实时显示在画矩形窗口时的痕迹
        //显示视频图片到窗口
        imshow("camera",frame);
    //    select.zeros();
        //键盘响应
        c=(char)waitKey(20);
        if(27==c)//ESC键
            return -1;
    }
    return 0;
}
时间: 2024-08-29 04:05:16

OPenCV_摄像头视频捕获并画矩形框的相关文章

python+opencv选出视频中一帧再利用鼠标回调实现图像上画矩形框

最近因为要实现模板匹配,需要在视频中选中一个目标,然后框出(即作为模板),对其利用模板匹配的方法进行检测.于是需要首先选出视频中的一帧,但是在利用摄像头读视频的过程中我唯一能想到的方法就是: 1.在视频播放的过程中,当想选中哪幅图来标记目标时,按下暂停键. 2.框出你想要检测的目标. 那要怎么实现呢? 首先是暂停怎么实现呢?介于是摄像头直播,我们先将那副图像复制并在另一个窗口显示.然后关掉摄像头,就完成了暂停.后面标记完目标再打开摄像头就行了.那具体怎么实现呢... import cv2 dra

net 中捕获摄像头视频的方式及对比(How to Capture Camera Video via .Net) (转)

作者:王先荣前言    随着Windows操作系统的不断演变,用于捕获视频的API接口也在进化,微软提供了VFW.DirectShow和MediaFoundation这 三代接口.其中VFW早已被DirectShow取代,而最新的MediaFoundation被Windows Vista和Windows 7所支持.可惜的是,上述接口基于COM技术且灵活性很大,在.net中并不方便直接使用..net封装    老外有很多活雷锋,他们奉献了不少的开源项目,DirectShow.net是对Direct

【译】如何使用Vue捕获网络摄像头视频

几个月前,我一直关注着比特币的爆发并且在GDAX网站上注册账号.在注册验证的过程中,网站提示要通过计算机的网络摄像头提交我自己的一张照片作为照片ID.这是一个很酷的做法,让我思考一个问题:在网络浏览器上集成网络摄像头使用需要怎么做? 事实上,有一些HTML5的API可用于通过JavaScript与网络摄像头进行交互. 下面,我们来看下如何创建一个VueJS的Web应用,在Web浏览器上通过网络摄像头直接捕获. 使用Vue CLI创建Vue项目 为了使项目更易于的理解,我们将从头开始搭建项目.为方

视频捕获

目 录 一. 视频捕获快速入门 2 二.基本的捕获设置 3 1.设置捕获速度: 3 2.设置终止捕获 4 3.捕获的时间限制 4 三.关于捕获窗口 4 1.创建一个AVICAP捕获窗口 5 2.将一个捕获窗口连接至捕获设备 5 3. 父窗口与子窗口的交互 5 4.捕获窗口的状态 6 四.视频捕获驱动和音频驱动 6 1.视频捕获驱动的性能: 6 2.视频对话框: 6 3.PREVIEW 和 OVERLAY模式: 7 4.视频格式 7 5.视频捕获设置 7 6.声频格式 8 五.使用视频捕获 8 1

CCapture directshow 视频捕获类

[cpp] view plaincopy // Capture.h for class CCapture #include <dshow.h> #include <qedit.h> #include <atlbase.h> #if !defined(CAPTURE_H_________) #define CAPTURE_H_________ // image size: 160*120  176*144   320*240  640*480  1024*1806 #de

OpenCV获取摄像头视频并在MFC的Picture控件上显示

分为两步:OpenCV获取摄像头数据+图像在Picture上显示 第一步:OpenCV获取摄像头数据 参考:http://www.cnblogs.com/epirus/archive/2012/06/04/2535190.html http://blog.sina.com.cn/s/blog_6dbe9bdb0100nii7.html http://blog.csdn.net/augusdi/article/details/8762961 #include "stdafx.h" #in

FPGA_VIP_V101 摄像头视频采集 调试总结之SDRAM引起的水平条纹噪声问题

此问题困扰我很近,终于在最近的项目调整中总结了规律并解决了. 因为之前对sdram并不熟悉,用得也不是太多,于是从淘宝购买了各自廉价的sdram,其中型号: htt56v6229cot-7 hy57v641620etp-h hy57b561620etp-h hy57v641620ftp-7 hy57v561620ct-6 进行评估,各自玩,在简单的测试例程中并未发现没什么区别(SDRAM串口调试.SDRAM-VGA显示.摄像头视频缓冲) 各种例程玩转,觉得非常high,偶尔有遇到不同例程对sdr

Android IOS WebRTC 音视频开发总结(八十五)-- 使用WebRTC广播网络摄像头视频(下)

本文主要介绍WebRTC (我们翻译和整理的,译者:weizhenwei,校验:blacker),最早发表在[编风网] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:blackerteam 或 webrtcorgcn). 回顾:Android IOS WebRTC 音视频开发总结(八十三)-- 使用WebRTC广播网络摄像头视频(上) 连接网络摄像头 正如上文所提,我们选用一款简单的D-Link DCS-7010L网络摄像头.关键原因在于它支持RTSP协议,因此服务

背景建模技术(五):视频捕获(VideoCapture)模块

本次对"视频捕获(VideoCapture)模块"做出分析,给出源代码和对应的程序流程框架. 视频捕获模块的主要功能是设置视频或相机参数,并读取设置配置参数,最后进入帧处理模块的process进程,该模块的源码如下,请重点关注start()函数: #include "VideoCapture.h" namespace bgslibrary { namespace VC_ROI { IplImage* img_input1 = 0; IplImage* img_inp