opencv-视频处理--画线(越线、拌线)

视频处理中,经常有做一些行人、车辆或者其它运动物体越线检测,越界检测。

原视频流:

下面用opencv介绍两种方式,画直线(越线、拌线):

第一种:固定第一帧,或者暂停视频,在固定的一帧中完成画直线的功能

#include<iostream>
using namespace std;

#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
using namespace cv;

/*--------------------------------定义鼠标事件--画直线--------------------------*/
bool got_line = false;
//全局变量
Point beginPoint=Point(0,0);//--注意这个有一个初始化的(0,0)
bool got_beigin_point = false;
Point endPoint=Point(0,0);//--注意这个有一个自己默认的初始化(0,0)
void mouseLineHandler(int event, int x, int y, int flags, void *param)
{
	switch(event)
	{
	case CV_EVENT_LBUTTONDOWN:
		beginPoint = Point(x,y);
		endPoint = beginPoint;
		got_beigin_point = true;
		break;
	case   CV_EVENT_MOUSEMOVE:
		if(got_beigin_point)
		{
			endPoint = Point(x,y);
		}
		break;
	case CV_EVENT_LBUTTONUP:
		got_line = true;
		endPoint = Point(x,y);
		break;
	default:
		break;
	}
}
/*---------------------------------------------------------------------------------------------*/
 int main(int argc,char*argv[])
 {
	 //读取视频
	 VideoCapture video(argv[1]);

	 //判断视频是否打开
	 if( !video.isOpened())
		 return 0;

	 //视频中的第一帧
	 Mat firstFrame;

	 Mat frame;

	 //读取视频的第一帧
	 video>>frame;

	 //复制到firstFrame中
	 frame.copyTo(firstFrame);

	 //register
	 namedWindow("video",1);
	 setMouseCallback("video",mouseLineHandler,NULL);

	 //画线
	 while(!got_line)
	 {
		 firstFrame.copyTo(frame);
		 line(frame,beginPoint,endPoint,Scalar(255,0,0),2);
		 imshow("video",frame);
		 if(waitKey(50) == ‘q‘)//---------很重要
			 break;
	 }
	 //remove callback
	 setMouseCallback("video",NULL,NULL);

	 //视频继续
	 for(;;)
	 {
		  video>>frame;
		  line(frame,beginPoint,endPoint,Scalar(255,255,0),2);
		  imshow("video",frame);
		  if(waitKey(33) == ‘q‘)
			  break;
	 }
	 return 0;
 }
 /*-----------------------------------------------------------------*/

【结果】:最好亲手试一下,才能看出区别


第二种:不影响视频播放的情况下,完成画直线的功能

#include<iostream>
using namespace std;

#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
using namespace cv;

/*--------------------------------定义鼠标事件--画直线--------------------------*/
bool got_line = false;
//全局变量
Point beginPoint=Point(0,0);//--注意这个有一个初始化的(0,0)
bool got_beigin_point = false;
Point endPoint=Point(0,0);//--注意这个有一个自己默认的初始化(0,0)
void mouseLineHandler(int event, int x, int y, int flags, void *param)
{
	switch(event)
	{
	case CV_EVENT_LBUTTONDOWN:
		beginPoint = Point(x,y);
		endPoint = beginPoint;
		got_beigin_point = true;
		break;
	case   CV_EVENT_MOUSEMOVE:
		if(got_beigin_point)
		{
			endPoint = Point(x,y);
		}
		break;
	case CV_EVENT_LBUTTONUP:
		got_line = true;
		endPoint = Point(x,y);
		break;
	default:
		break;
	}
}
/*---------------------------------------------------------------------------------------------*/
 int main(int argc,char*argv[])
 {
	 //读取视频
	 VideoCapture video(argv[1]);

	 //判断视频是否打开
	 if( !video.isOpened())
		 return 0;

	 //视频帧
	 Mat frame;

	 //register
	 namedWindow("video",1);
	 setMouseCallback("video",mouseLineHandler,NULL);

	 //画直线
	 for(;;)
	 {
		 video>>frame;
		  line(frame,beginPoint,endPoint,Scalar(0,255,255),2);
		   imshow("video",frame);
		   if(got_line)
			   break;
		   if(waitKey(50)==‘q‘)
			   break;
	 }

	 //remove callback
	 setMouseCallback("video",NULL,NULL);

	 //视频继续
	 for(;;)
	 {
		  video>>frame;
		  line(frame,beginPoint,endPoint,Scalar(0,255,255),2);
		  imshow("video",frame);
		  if(waitKey(33) == ‘q‘)
			  break;
	 }
	 return 0;
 }
 /*-----------------------------------------------------------------*/

【结果】:

时间: 2024-12-08 21:03:47

opencv-视频处理--画线(越线、拌线)的相关文章

双绞线的制作,T568A线序,T568B线序

双绞线的制作 1.1 实验目的 双绞线是组建局域网时常常使用的通信传输介质,通过本实验,让学生学会制作双绞线. 1.2 实验任务 (1)了解双绞线的特性及屏蔽与非屏蔽双绞线的区别. (2)了解EIA/TIA 568A标准和EIA/TIA 568B标准,掌握网线的线序. T568A线序: 1    2   3   4   5   6   7   8 绿白 绿 橙白 蓝 蓝白 橙 棕白 棕 T568B线序 : 1    2   3   4   5   6   7   8 橙白 橙 绿白 蓝 蓝白 绿

OpenCV 视频处理框架

OpenCV 本身集成了 FFmpeg,因此对于视频是有解码和编码功能的.虽然其效率在本人看来还不能跟未被封装的FFmpeg相提并论,然用其来对视频进行解码得到图像,然后对图像进行处理并将得到的图像重新压缩成视频是非常方便的,下面将介绍将视频解码成图像并进行帧差法等操作的框架搭建,虽然没有介绍如何反向压缩成视频,但其操作也是非常类似的,不过需要注意的是在OpenCV2.1版本图像压缩成视频记得是有BUG的,最好还是用新的版本来进行学习. #include <afxwin.h> #include

OpenCV视频序列操作基础

 从视频序列中抓取一帧 OpenCV支持从摄像头或视频文件(AVI)中抓取图像. 从摄像头获取初始化: CvCapture* capture = cvCaptureFromCAM(0); // capture from video device #0 从视频文件获取初始化: CvCapture* capture = cvCaptureFromAVI("infile.avi"); 抓取帧: IplImage* img = 0; if(!cvGrabFrame(capture)){  

线上操作与线上问题排查实战

转自:https://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==&mid=2651960323&idx=1&sn=e04af14d2ebf939133869e0f18bb0dd1&chksm=bd2d01df8a5a88c98c3cb94a99334a16b372fd997f36bc757a38bb44b70d977797fa840064dc&mpshare=1&scene=23&srcid=0816Yl1Rl

简单移动平均线、加权移动平均线、指数平滑移动平均

移动平均线的种类 移动平均线可分为"算术移动平均线"."加权移动平均线"."指数平滑移动平均线"三种. 1.算术移动平均线(MA) 算术移动平均线是简单而普遍的移动平均线.平均线是指算术平均数,计算方法为一组数字相加,除以该组数据的组成个数. 以5天移动平均线为便,计算方法如下: MA=(C1+C2+C3+C4+C5)/5 一般公式:MA=(C1+C2+C3+C4+C5+....+Cn)/n C:第一日收盘价 n:移动平均数周期 "移动

从线下走到线上,艺术品能否找到新突破口?

艺术品因其具有的收藏价值.文化价值.观赏价值以及不可复制性,让收藏者愿不远万里前去赴约,许以千金只求抱得珍品归.中国作为有五千年悠久历史的古国之一,前人留下的传世艺术品不计其数,艺术品交易需求不小,但是传统的线下艺术品交易方式存在着许多弊端. 传统线下艺术品交易,不管是画廊还是拍卖的形式都受到了地域和空间的限制,知名画廊或拍卖机构大多集中在一.二线城市,譬如北京著名的798艺术区,国内外消费者在购买艺术品时都要长途奔波,耗费购买之外的时间和费用.此外,由于线下画廊属于私下交易,成交价格保密,传统

OpenCV视频读取播放,视频转换为图片

转载请注明出处!!! http://blog.csdn.net/zhonghuan1992 OpenCV视频读取播放,视频转换为图片 介绍几个有关视频读取的函数: VideoCapture::VideoCapture VideoCapture能够从文件里或者摄像头中读取视频,这是提供给C++的接口的.C的接口是CvCapture结构.        <span style="white-space:pre"> </span>C++: VideoCapture::

CubieBoard开发板不用ttl线也不用hdmi线的安装方法

本文重点在于CubieBoard开发板系统的初始化安装,并且不用ttl和hdmi线,开机就可以远程ssh进系统.本文适合没有配线的同学参考操作.事实上,无论有没有ttl线,按照本文的方法安装效率都是一样的. ##需求条件 本地环境:Linux (我的是ubuntu11.04) 一个CubieBoard开发板 一个sd卡的读卡器 一个4G的SD卡 一个你已经确定好要安装的系统img文件,不是uboot而是完整的系统! 我选的安装包Linaro/Ubuntu custom server images

微寻,把“线下医院”带到“线上轻松问诊”

国内医生资源分布不均,造成人们看病难等问题,像北京.上海.广州等一线城市,医疗机构相对丰富均匀,方便当地人轻松看病,但对于以外的城市居民和城外乡民都很不利,生病了如果是小病,在当地找个医生就可以了,但如果是大病,也不得不去大医院治疗.还有,即使想要去大医院治疗,还要排队等待很久,并且不一定轮得到自己,这会造成患者病情严重,浪费人力物力财力等,对患者来说,是非常大的损失,那么,如何解决这些问题呢? 随着医疗健康越来越受国人关注,并在国家各种政策支持下,医疗技术.医疗服务.医疗设备等得到突飞猛进,为