2015-10-12 76 views
1

enter image description hereopencv的檢測邊界和ROI掩模

嗨,我已經用黃色邊界框附接下面的圖片。在Opencv中是否有算法或算法序列,我可以通過它檢測黃色像素並創建一個ROI遮罩(將遮擋其外部的所有像素)。

+1

如果它總是那種黃色的色調,你可以很容易地使用inRange方法。然後使用findContours來獲得外部輪廓。之後,您可以從該輪廓中繪製填充蒙版,並將蒙版應用於圖像,以僅將蒙版區域複製到新的黑色圖像。 – Micka

+0

你總是有相同的輪廓顏色?它保證在圖像中獨一無二(沒有其他黃色背景點)?每個圖像只有一個黃色輪廓,或者可以是多個? – Miki

+0

@Miki:背景中可能有黃色像素。如果我們發現這種情況,我們將來可以使用不同的顏色。是的,每個圖像只有一個黃色輪廓 –

回答

3

你可以這樣做:

  1. 找到黃多邊形
  2. 填充多邊形的內部
  3. 只複製多邊形內部的黑色初始化圖像

找到黃色多邊形

不幸的是,您使用抗鋸齒繪製黃線,因此黃色不是純黃色,但由於插值而具有更寬的範圍。這也影響最終的結果,因爲一些不是黃色像素將被包括在結果圖像中。您可以通過不使用抗鋸齒功能輕鬆解決此問題。

所以最好的選擇是將圖像轉換成HSV空間(在這裏更容易分割單一顏色),並且只保留純黃色範圍內的值。

如果您不使用抗鋸齒功能,則甚至不需要轉換爲HSV,只需保留其值爲純黃色的點。

填充多邊形的內部 您可以使用floodFill來填充多邊形。你需要一個起點。既然我們不知道一個點是否在多邊形內部(並且由於多邊形不是凸的,因此可能不安全),我們可以安全地假設點(0,0),即左上角該圖像在多邊形之外。然後我們可以填充多邊形的外部,然後反轉結果。

只複製多邊形黑色初始化圖像內

一旦你的面膜,只需使用copyTo與口罩,黑色圖像下的非零像素的內容複製面具。

這裏全碼:

#include <opencv2\opencv.hpp> 
using namespace cv; 

int main() 
{ 
    Mat3b img = imread("path_to_image"); 

    // Convert to HSV color space 
    Mat3b hsv; 
    cvtColor(img, hsv, COLOR_BGR2HSV); 

    // Get yellow pixels 
    Mat1b polyMask; 
    inRange(hsv, Scalar(29, 220, 220), Scalar(31, 255, 255), polyMask); 

    // Fill outside of polygon 
    floodFill(polyMask, Point(0, 0), Scalar(255)); 

    // Invert (inside of polygon filled) 
    polyMask = ~polyMask; 

    // Create a black image 
    Mat3b res(img.size(), Vec3b(0,0,0)); 

    // Copy only masked part 
    img.copyTo(res, polyMask); 

    imshow("Result", res); 
    waitKey(); 

    return 0; 
} 

結果:

enter image description here

注意

請注意,有結果圖象中幾乎黃色像素。如上所述,這是由於抗鋸齒造成的。

+0

您是如何找到HSV範圍內黃色值的範圍的?我正在使用此網站,http://www.colorspire.com/rgb-color-wheel/。我的意思是保持色調恆定在42(或60度)並且只是調整飽和度,值會給出範圍。但我錯了 –

+1

查看[這裏](http://stackoverflow.com/a/31465462/5008845)瞭解詳情。黃色是HSV 60°,100%,100%,在OpenCV中,它編碼爲30,255,255。 H通道值減半並且在範圍[0,180]中,S和V在範圍[0,255] – Miki