我使用幀差異和opencv來檢測幀之間的移動(absdiff,閾值,侵蝕等)。使用opencv檢測黑色背景上的白色物體的矩形
我該如何獲得運動的各個位置(矩形:x,y,寬度,高度)的座標,基本上是白色斑點?
我使用幀差異和opencv來檢測幀之間的移動(absdiff,閾值,侵蝕等)。使用opencv檢測黑色背景上的白色物體的矩形
我該如何獲得運動的各個位置(矩形:x,y,寬度,高度)的座標,基本上是白色斑點?
我正在做同樣的事情。這裏是我的代碼(有些東西在不同的類中處理,我只是把它放在這裏)。第一部分是你已經擁有的內容,跳到輪廓部分。
/* This is the background subtraction you already have */
Mat tmp1;
GaussianBlur(frame, tmp1, Size(5,5),0,0); //Blurring one image is sufficient to eliminate noise
absdiff(tmp1, frameLast, tmp1);
cvtColor(tmp1,tmp1,CV_RGB2GRAY);
threshold(tmp1, tmp1, CV_THRESH_OTSU, 100, CV_THRESH_BINARY);
/*cleaning up */
int erosion_type = MORPH_RECT; // MORPH_RECT, MORPH_CROSS, MORPH_ELLIPSE
int erosion_size = 3;
Mat erosion_element = getStructuringElement(erosion_type, Size(2*erosion_size + 1, 2*erosion_size+1), Point(erosion_size, erosion_size));
int dilation_type = MORPH_RECT;
int dilation_size = 5;
Mat dilation_element = getStructuringElement(dilation_type, Size(2*dilation_size + 1, 2*dilation_size+1), Point(dilation_size, dilation_size));
erode(tmp1,tmp1,erosion_element);
dilate(tmp1,tmp1,dilation_element);
/* Here I am getting the contours */
vector<vector<Point> > contours;
findContours(tmp1, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
int minArea = 100, maxArea = 1000; //keep only contours of a certain size
for (vector<vector<Point> >::iterator it=contours.end(); it!=contours.begin(); it--) {
if ((*it).size()<minArea || (*it).size()>maxArea) {
contours.erase(it);
}
}
drawContours(displayer, contours, a, Scalar(122,200,222),2);
見here瞭解更多詳情(特別是選擇在其輪廓發現,可以幫助你縮小你發現了什麼。我只是用CV_RETR_EXTERNAL)。
請注意,我製作了一個Mat顯示器,它是一個frame複製的深層副本(用frame.copyTo(displaysyer)複製),這是因爲如果你直接在frame上繪製東西,它會被轉移到「frameLast」並彈出下一個absDiff,當然你可以通過在繪製前將frame完全複製到frameLast來避免這個額外的圖像(所以最後繪製所有東西),我這樣做,這樣我就可以從代碼中的任何地方輕鬆繪製,現在更容易,因爲我嘗試了很多東西,並希望能夠有時看到中間步驟。
輪廓尺寸()不是一個區域。它是輪廓中的點數。 – kelin 2016-07-20 16:22:20
基本上,你可能想嘗試cvBlobsLib。目前使用它。當然,首先它是非常很難處理它,稍後當你使用它時,使用起來非常簡單,它會在圖像中找到白斑,副斑反之亦然。那麼你可以使用邊界框。從那裏你可以得到點位置。
您可以先使用'cvFindContour'。然後使用'cvBoundingRect'來解決它。 – 2012-04-28 17:32:39