2015-06-11 60 views
2

的座標,我從紅僅由下面的算法來實現過濾的輸出如下:OpenCV中得到紅只有矩形區域

cv::Mat findColor(const cv::Mat & inputBGRimage, int rng=20) 
{ 
    // Make sure that your input image uses the channel order B, G, R (check not implemented). 
    cv::Mat mt1, mt2; 
    cv::Mat input = inputBGRimage.clone(); 
    cv::Mat imageHSV; //(input.rows, input.cols, CV_8UC3); 
    cv::Mat imgThreshold, imgThreshold0, imgThreshold1; //(input.rows, input.cols, CV_8UC1); 

    assert(! input.empty()); 

    // blur image 
    cv::blur(input, input, Size(11, 11)); 

    // convert input-image to HSV-image 
    cv::cvtColor(input, imageHSV, cv::COLOR_BGR2HSV); 

    // In the HSV-color space the color 'red' is located around the H-value 0 and also around the 
    // H-value 180. That is why you need to threshold your image twice and the combine the results. 
    cv::inRange(imageHSV, cv::Scalar(H_MIN, S_MIN, V_MIN), cv::Scalar(H_MAX, S_MAX, V_MAX), imgThreshold0); 

    if (rng > 0) 
    { 
     // cv::inRange(imageHSV, cv::Scalar(180-rng, 53, 185, 0), cv::Scalar(180, 255, 255, 0), imgThreshold1); 
     // cv::bitwise_or(imgThreshold0, imgThreshold1, imgThreshold); 
    } 
    else 
    { 
     imgThreshold = imgThreshold0; 
    } 

    // cv::dilate(imgThreshold0, mt1, Mat()); 

    // cv::erode(mt1, mt2, Mat()); 

    return imgThreshold0; 

} 

這裏是輸出:

enter image description here

我想檢測矩形的四個座標。正如你所看到的,輸出並不完美,我之前使用cv::findContourscv::approxPolyDP一起使用,但它不再有效。

有沒有辦法,我可以申請輸入圖像(除模糊,擴張,侵蝕)的任何過濾器進行處理的圖像更好?

有什麼建議嗎?

更新時間:

當我使用findContours這樣的:

findContours(src, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE); 

double largest_area = 0; 

for(int i = 0; i < contours.size(); i++) { // get the largest contour 
    area = fabs(contourArea(contours[i])); 
    if(area >= largest_area) { 
     largest_area = area; 
     largestContours.clear(); 
     largestContours.push_back(contours[i]); 
    } 
} 

if(largest_area > 5000) { 
    cv::approxPolyDP(cv::Mat(largestContours[0]), approx, 100, true); 
    cout << approx.size() << endl; /* ALWAYS RETURN 2 ?!? */ 
} 

像預期的那樣approxPolyDP不工作。

回答

3

我覺得你的結果是相當不錯的,要是你使用Image Moments,然後尋找更大的輪廓的最小旋轉矩形選擇具有最大面積的輪廓。

vector<cv::RotatedRect> cv::minRect(contours.size()); 

for(size_t = 0; i < contours.size(); i++) 
{ 
    minRect[i] = minAreaRect(cv::Mat(contours[i])); 
} 

Rotated Rect類已經有Point2f的載體來存儲點。

RotatedRect rRect = RotatedRect(Point2f(100,100), Size2f(100,50), 30); 
Point2f vertices[4]; 
rRect.points(vertices); 

for(int i = 0; i < 4; i++){ 
    std::cout << vertices[i] << " "; 
} 
+0

有沒有辦法使用RotatedRect檢測4個點的座標? – vitozev

+1

@unixarmy - 您可以使用'findContours'並使用'CV_CHAIN_APPROX_SIMPLE'標誌。給定一個直立的矩形形狀,這應該導致在形狀中檢測到4個點,對應於角點。請參閱:http://docs.opencv.org/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html#findcontours – rayryeng

+0

rayryeng建議可能實際上可以解決您的問題。 – Aristu