靜態背景下運動目標定位演算法實現

2021-10-03 10:53:25 字數 3852 閱讀 6922

靜態背景下運動目標定位演算法說明

本程式開發環境為opencv2.41,只要為以上版本應該都能正常執行,測試的pc機基本資訊如下:

如果需要改變檢測的速度和檢測的精度可以改變源程式中的變數shrink的值

shrink為進行減差時縮小的倍數,源程式預設為長寬縮小

2倍,即原影象縮小為原來的

1/4,縮小倍數越小檢測速度相應的越快,但不是無限的提速,當大小達到寬

150畫素,高

100畫素左右時(每秒檢測時間為

16ms

左右 每秒檢測

60-70

15ms

左右)

3ms,也就是可以達到

300幀以上

基本思路:檢測到上一幀有運動目標時進行3*3區域性搜尋減差進行檢測,如果上一幀沒有目標定位框時進行全圖檢測

本程式所有的測試資料都已附著在此資料夾裡面

#include#include

using

namespace

cv;using

namespace

std;

//定義全域性變數

rect predrawrect;//

前一幀的定位框

int shrink = 2;//

幀縮小倍數 在此處改變你所要縮小原圖檢測的倍數

string videoaddress = "";

int frame_num = 1;//

記錄迴圈幀數

rect searchrect;//

定義搜尋區域

mat nowframe;

//運動物體檢測函式宣告

mat movedetect(mat temp, mat frame);

//求矩形的中心點

point getcenterpoint(rect rect);

//獲取兩點間的距離

double

getdistance(point p1, point p2);

void

main()

else

cap >> nowframe;//

等價於cap.read(frame);

if (nowframe.empty())

resize(nowframe, frame, size(nowframe.cols / shrink, nowframe.rows / shrink));//

frame是縮減後的當前幀的圖

//frame = nowframe.clone();

cvtcolor(frame, frame, cv_rgb2gray);

resultframe = movedetect(temp, frame);//

在搜尋區域內檢測

imshow(

"result

", resultframe);

waitkey(

1);//

每幀延時1毫秒

preframe =nowframe.clone();

}cap.release();

//釋放資源}//

幀差和目標檢測

mat movedetect(mat temp, mat frame)

if (search_tly < 0

)

if (search_brx < 0

)

if (search_bry < 0

)

if (search_tlx >temp.cols)

if (search_tly >temp.rows)

if (search_brx >temp.cols)

if (search_bry >temp.rows)

int t1 = 20, t2 = 200

;

for (int i = search_tlx; i < search_brx - 1; i++) }}

mat element = getstructuringelement(morph_rect, size(30 / shrink, 30 / shrink)); //

第乙個引數morph_rect表示矩形的卷積核,當然還可以選擇橢圓形的、交叉型的

//高階形態學處理,形態學閉操作處理

morphologyex(diff, diff, morph_close, element);

//6.查詢輪廓並繪製輪廓

vector>contours;

//drawcontours(result, contours, -1, scalar(0, 0, 255), 2);

//在result上繪製輪廓

//7.查詢正外接矩形

vectorboundrect(contours.size());

rect maxrect;

int maxarea = 0

;

for (int i = 0; i < boundrect.size(); i++)

}int pre_rect_width = (predrawrect.br().x - predrawrect.tl().x);//

上乙個目標框的寬

int pre_rect_height = (predrawrect.br().y - predrawrect.tl().y);//

上乙個目標框的高

rect drawrect = maxrect;//

把最大的矩形框賦值給當前定位框

predrawrect =drawrect;

//在上乙個矩形標註框的3*3的區域搜尋矩形

if (predrawrect.area() != 0

)

else

//求縮放之後真實的定位框位置

int tlx = drawrect.tl().x*shrink;

int tly = drawrect.tl().y*shrink;

int brx = drawrect.br().x*shrink;

int bry = drawrect.br().y*shrink;

rect realdrawrect =rect(point(tlx, tly), point(brx, bry));

//求縮放之後真實的搜尋框位置

search_tlx = searchrect.tl().x*shrink;

search_tly = searchrect.tl().y*shrink;

search_brx = searchrect.br().x*shrink;

search_bry = searchrect.br().y*shrink;

rect realsearchrect =rect(point(search_tlx, search_tly), point(search_brx, search_bry));

rectangle(result, realdrawrect, scalar(

0, 0, 255), 2);//

在result上繪製選出的搜尋區域內的正外接矩形

//rectangle(result, realsearchrect, scalar(255, 255, 0), 2);

return result;//

返回result }//

求矩形框的中心點

point getcenterpoint(rect rect)

//求兩點之間的距離

double

getdistance(point p1, point p2)

運動背景下的運動目標檢測

各種目標檢測方法介紹 懶人可以直接略過 目標檢測是乙個老話題了,在很多演算法當中都有它的身影。目標檢測要做的就兩件事 檢測當前中有沒有目標?如果有的話,在哪?按照先驗知識和背景運動來劃分的話,目標檢測方法大概可以分為兩大類 第一,已知目標的先驗知識。在這種情況下檢測目標有兩類方法,第一類方法是用目標...

運動目標檢測 背景減法

一 原理 背景減法 background subtraction 是當前運動目標檢測技術中應用較為廣泛的一類方法,它的基本思想和幀間差分法相類似,都是利用不同影象的差分運算提取目標區域。不過與幀間差分法不同的是,背景減法不是將當前幀影象與相鄰幀影象相減,而是將當前幀影象與乙個不斷更新的背景模型相減,...

運動目標檢測OpenCV背景減除法

背景減除法 1.gmm mog2演算法,高斯混合模型分離演算法,它為每個畫素選擇適當數量的高斯分布 函式 cv2.createbackgroundsubtractormog2 int history 500,double varthread 16,bool detectshadows true 2....