我正在使用C++環境中的OpenCV開發軟件。 其目標是檢測拳擊手套並圍繞手套輪廓繪製邊框。OpenCV邊界框
我遇到的問題是邊界框不止一次被淹沒,實際上多個框被繪製。過去幾天我試圖做的是以某種方式消除繪製的盒子的數量,並且只畫出一個大的邊框。
我正在尋找一些技術來填充整個對象,我相信這對於這種情況非常有幫助。
下面我貼我用來實現圖像中顯示的結果代碼:
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
vector<Vec3f> vecCircles;
vector<Vec3f>::iterator itrCircles;
while(1)
{
Mat frame;
cap >> frame; // get a new frame from camera
/////////////////////
Mat imgHSV;
cvtColor(frame, imgHSV, CV_BGR2HSV);
////////////////////
Mat blur_out;
GaussianBlur(imgHSV, blur_out, Size(1,1),2.0,2.0);
////////////////////
Mat range_out;
inRange(blur_out, Scalar(100, 100, 100), Scalar(120, 255, 255), range_out);
////////////////////
findContours(range_out, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
/// Approximate contours to polygons + get bounding rects and circles
vector<vector<Point> > contours_poly(contours.size());
vector<Rect> boundRect(contours.size());
vector<Point2f>center(contours.size());
vector<float>radius(contours.size());
for(int i = 0; i < contours.size(); i++)
{
approxPolyDP(Mat(contours[i]), contours_poly[i], 3, true);
boundRect[i] = boundingRect(Mat(contours_poly[i]));
}
/// Draw polygonal contour + bonding rects
Mat drawing = Mat::zeros(range_out.size(), CV_8UC3);
for(int i = 0; i< contours.size(); i++)
{
Scalar color = Scalar(255,0,255);
drawContours(drawing, contours_poly, i, color, 1, 8, vector<Vec4i>(), 0, Point());
rectangle(drawing, boundRect[i].tl(), boundRect[i].br(), color, 2, 8, 0);
}
如果任何人都可以提出一些提示或提供在哪裏可以找到答案,一些信息源爲我的問題。
編輯(快速更新):
我設法逐步提高輸出圖像安靜點時安靜高興的結果。關鍵是使用侵蝕&擴張以及在我的findContours()
功能。我將CV_RETR_TREE
更改爲CV_RETR_EXTERNAL
。還有一些其他的小事情我解決,但結果是好的:
不知道如果我應該寫這這裏,或打開新的線程....但現在我需要一些幫助,成分標籤和提取中心點和麪積等參數。 :)
隨意了投票,幫助你的答案。 – karlphillip