靜態背景下運動目標定位演算法說明
本程式開發環境為opencv2.41,只要為以上版本應該都能正常執行,測試的pc機基本資訊如下:
如果需要改變檢測的速度和檢測的精度可以改變源程式中的變數shrink的值
shrink為進行減差時縮小的倍數,源程式預設為長寬縮小
2倍,即原影象縮小為原來的
1/4,縮小倍數越小檢測速度相應的越快,但不是無限的提速,當大小達到寬
150畫素,高
100畫素左右時(每秒檢測時間為
16ms
左右 每秒檢測
60-70
15ms
左右)
3ms,也就是可以達到
300幀以上
基本思路:檢測到上一幀有運動目標時進行3*3區域性搜尋減差進行檢測,如果上一幀沒有目標定位框時進行全圖檢測
本程式所有的測試資料都已附著在此資料夾裡面
#include#includeusing
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....