1. 程式人生 > >opencv-視訊處理--畫線(越線、拌線)

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;
 }
 /*-----------------------------------------------------------------*/

【結果】:



根據這一篇得到了視訊中的直線,然後再根據前景檢測,就可以得到運動物體的越線檢測,拌線檢測

相關推薦

opencv-視訊處理--

視訊處理中,經常有做一些行人、車輛或者其它運動物體越線檢測,越界檢測。原視訊流:下面用opencv介紹兩種方式,畫直線(越線、拌線):第一種:固定第一幀,或者暫停視訊,在固定的一幀中完成畫直線的功能#include<iostream> using namespac

【ArcGIS|空間分析】利用DEM提取山脊山谷水文分析表面分析

參考湯國安、楊昕等編著的《地理資訊系統空間分析實驗教程第二版》 利用水文分析(流量)和表面分析(坡向變率)得到山脊和山谷線 文章目錄 1、基本概念 正地形 負地形 正負地形的影響 2、水文分析方法

第一章 概論 計算機網絡筆記 學堂在 1.3交換方式電路交換分組交換

機制 雙向 鏈路 導致 控制 嚴格 計算 電話 節點數 交換就是要建立兩種機制:   建立數據傳輸通路機制   控制數據傳輸過程機制 信道:是信號傳輸通道   1 發送端將數據轉換成信號   2 信號經過信道傳播到達接收端   3 接收端將信號還原成數據 1 電路交換

再談多程編程——程的概念程的創建守護程狀態的轉化

.cn 處理 優先級 nor 新建 exc 線程的創建 數據庫 時間 1、什麽是線程以及多線程與進程的區別 在現代操作在運行一個程序時,會為其創建一個進程。例如啟動一個QQ程序,操作系統就會為其創建一個進程。而操作系統中調度的最小單位元是線程,也叫輕量級進程,在一個進程裏可

學習筆記之——Opencv視訊處理模組

視訊訊號是重要的視覺資訊來源。視訊由一系列影象構成,這些影象稱為幀。幀以固定的時間間隔獲取(稱為幀速率,通常用幀/秒表示)。大多數計算機視覺方面的應用都是基於視訊來處理的,為此本博文作為Opencv視訊處理模組的學習筆記~ 幀的資料型別也是Mat。 讀取視訊序列。要從視訊序列讀取幀,只需

Python結合OpenCV視訊處理逐幀修改圖片

前言 2015年7月畢業至今,已有三年半時間了。這麼長的時間裡,非常感激CSDN、部落格園、簡書等眾多平臺及眾多作者提供了無數的幫助。這篇文章是我的第一篇文章,一方面希望能總結、沉澱一些知識,另一方面,也希望從今天開始,能或多或少地幫助一些有需要的朋友。 背景 OpenCV中,讀

OpenCV——修改影象隨心所欲

這一節將講述OpenCV——修改影象畫素,根據自己需要新增特定的畫素部分 原圖如下,我們就是先在這個視訊流上新增一條直線段(有一定寬度的) 現在我們想新增一條,135行-455行,列350--360的直線段 #include<opencv2/opencv.hp

OpenCV影象處理教程C++二十二基於距離變換與分水嶺的影象分割

影象分割是影象處理最重要的處理手段之一 影象分割的目標是將影象中畫素根據一定的規則分為若干個cluster集合每個集合包括一類畫素 根據演算法分為監督學習和無監督學習,影象分割的演算法多數都是無監督學習-KMenas 距離變換常見演算法有兩種 - 不斷膨

opencv-視訊處理--實時前景檢測-二幀差法

原視訊主要思想:通過當前幀的灰度圖(currentGrayFrame)和前一幀的灰度圖(previousGrayFrame)的差,進行畫素級的比較。符號::代表當前幀(x,y)處的灰度值:代表前一幀(x,y)處的灰度值:代表當前幀和上一幀在(x,y)處的差的絕對值如果:差值大

以太網布直通電纜交叉電纜反轉電纜

一、直通電纜 1. 連線的裝置: (1) 主機到交換機或集線器 (2) 路由器到交換機或集線器 注意事項:只用於乙太網,不用於語音網路、其他LAN和WAN 二、交叉電纜 1.連線的裝置 除用到直通電纜的地方其它的用交叉電腦(也可以理解為用

視訊處理術語解析1Vertical Blanking Interval (VBI)

垂直回掃期    我們通常收看的電檢視象是由電子槍發射的電子串高速轟擊顯象管上的熒光物質而產生的,電子串按從左至右,從上至下的方式掃描整個螢幕,因為速度十分快,所以我們的眼睛感覺不到,當電子槍的掃描位置從左上角達到右下角時,必須由右下角回到左上角,開始下一次掃描,從右下角回到左上角所花費的時間就是垂直回掃期

day39——多程實例程鎖

sta 提取 修飾 start 解決 也有 pen pro finished python的鎖可以獨立提取出來 1 mutex = threading.Lock() 2 #鎖的使用 3 #創建鎖 4 mutex = threading.Lock() 5 #鎖定 6 mut

用單進程程並發程分別實現爬一個或多個網站的所有鏈接,用瀏覽器打開所有鏈接並保存截圖 python

app imp mat 並發執行 cut h+ chrome 鏈接 目錄 #coding=utf-8import requestsimport re,os,time,ConfigParserfrom selenium import webdriverfrom multipr

OpenCV——圖像的矩計算矩輪廓面積輪廓或曲線長度

inf 分享圖片 open 分享 面積 image http 技術 技術分享 OpenCV——圖像的矩(計算矩、輪廓面積、輪廓或曲線長度)

Python曲線圖論文,報告等常用

<pre name="code" class="python">在很多時候,例如寫論文,例如寫報告,例如做ppt,都需要花很多很多曲線圖,讓人家信服 畢竟資料視覺化是人的本能。 假如讀者您很不幸,像我一樣不會用matlab之類的東西畫圖或者沒辦法用matlab畫圖,那麼可以稍微關注一下p

java處理word公式wmf格式轉換成svgsvg格式轉換成png

wmf格式轉換成svg 把wmf格式轉成svg格式,這樣就能在瀏覽器中顯示了 需要第三方jar包:wmf2svg-0.9.6.jar //wmf格式的圖片轉換成svg格式 private void convert(String file,String dest) throws Ex

IIS7的整合模式下如何讓自定義的HttpModule不處理靜態檔案.html .css .js .jpeg等請求

轉載:https://www.cnblogs.com/opencoder/p/5854454.html ASP.NET 4.0後Web.config檔案的Module配置節點有一個可選項叫preCondition如下面程式碼所示: <system.webServer> <mod

文字溢位處理為省略號多行單行

文字溢位處理 一、單行文字溢位處理 效果圖: html程式碼: <body> <div class="text">vukfjygfvhjvfgdtryutfvghdfkjgfdhgfhjgdfdgj</div> <div

海量資料處理:十道面試題與十個海量資料處理方法總結大資料演算法面試題

第一部分、十道海量資料處理面試題 1、海量日誌資料,提取出某日訪問百度次數最多的那個IP。       首先是這一天,並且是訪問百度的日誌中的IP取出來,逐個寫入到一個大檔案中。注意到IP是32位的,最多有個2^32個IP。同樣可以採用對映的方法

opencv-python 的Camshift函式附逐行詳解

這是我在OpenCV-python教程中找到的程式碼並附上的詳解 import cv2 import numpy as np cap = cv2.VideoCapture(0) # ret判斷是否讀到圖片 # frame讀取到的當前幀的矩陣 # 返回的是元組型別,所以