2016-03-07 63 views
0

我正在處理視頻圖像,我想檢測視頻是否包含某個紅色範圍內的任何像素。這可能嗎?OpenCV:我如何解釋inRange的結果?

這裏是我從一個教程適應代碼:

#ifdef __cplusplus 
- (void)processImage:(Mat&)image; 
{ 
    cv::Mat orig_image = image.clone(); 
    cv::medianBlur(image, image, 3); 
    cv::Mat hsv_image; 
    cv::cvtColor(image, hsv_image, cv::COLOR_BGR2HSV); 
    cv::Mat lower_red_hue_range; 
    cv::Mat upper_red_hue_range; 
    cv::inRange(hsv_image, cv::Scalar(0, 100, 100), cv::Scalar(10, 255, 255), lower_red_hue_range); 
    cv::inRange(hsv_image, cv::Scalar(160, 100, 100), cv::Scalar(179, 255, 255), upper_red_hue_range); 
    // Interpret values here 
} 

解釋值

我想檢測是否從INRANGE操作的結果是零或不是。換句話說,我想了解原始圖像中是否有匹配的像素,並且顏色inRange是從給定的較低和較高的紅色比例中獲得的。我怎樣才能解釋結果?

+0

首先,你需要OR或下面罩和上面罩。然後你可以「計數非零」來查看是否有非零像素(即你找到了某種東西)。首先應用形態學侵蝕或開放來刪除小(可能是噪音)的斑點或找到連接的組件('findContours','connectedComponentsWithStats')並根據某些標準修剪/搜索可能會更好 – Miki

+0

謝謝。我知道這是蹩腳的,但你能否添加一些示例代碼?這是我第一次OpenCV測試項目,我正在努力在如此短的時間內熟悉所有這些功能和概念。 – mm24

+0

我發佈了一個答案。這應該讓你開始。如果您有更精確的要求,請將它們添加到您的問題中,我會盡量做出更準確的答案。 – Miki

回答

0

首先,你需要或者下限和上限面膜:

Mat mask = lower_red_hue_range | upper_red_hue_range; 

然後你可以countNonZero,看看是否有非零像素(即你發現了什麼)。

int number_of_non_zero_pixels = countNonZero(mask); 

這可能是最好先申請形態學腐蝕或開口去除小(可能是嘈雜的)斑​​點:

Mat kernel = getStructuringElement(MORPH_ELLIPSE, Size(3, 3)); 
morphologyEx(mask, mask, MORPH_OPEN, kernel); // or MORPH_ERODE 

或找到連接組件(findContoursconnectedComponentsWithStats)剪枝/搜索根據一些標準:

vector<vector<Point>> contours 
findContours(mask.clone(), contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE); 

double threshold_on_area = 100.0; 
for(int i=0; i<contours.size(); ++i) 
{ 
    double area = countourArea(contours[i]); 
    if(area < threshold_on_area) 
    { 
     // don't consider this contour 
     continue; 
    } 
    else 
    { 
     // do something (e.g. drawing a bounding box around the contour) 
     Rect box = boundingRect(contours[i]); 
     rectangle(hsv_image, box, Scalar(0, 255, 255)); 
    } 
}