2015-09-11 19 views
14

Tôi có hình ảnh sau:OpenCV phát hiện tốt hơn màu đỏ?

enter image description here

Tôi muốn để phát hiện các hình chữ nhật màu đỏ sử dụng cv::inRange phương pháp và không gian màu HSV.

int H_MIN = 0; 
int H_MAX = 10; 
int S_MIN = 70; 
int S_MAX = 255; 
int V_MIN = 50; 
int V_MAX = 255; 

cv::cvtColor(input, imageHSV, cv::COLOR_BGR2HSV); 

cv::inRange(imageHSV, cv::Scalar(H_MIN, S_MIN, V_MIN), cv::Scalar(H_MAX, S_MAX, V_MAX), imgThreshold0); 

Tôi đã tạo trackbars động để thay đổi giá trị HSV, nhưng tôi không thể nhận được kết quả mong muốn.

Bất kỳ đề xuất nào cho các giá trị tốt nhất (và có thể là bộ lọc) để sử dụng?

Trả lời

27

Trong không gian HSV, màu đỏ kết thúc tốt đẹp quanh 180. Vì vậy, bạn cần các giá trị H là cả trong [0,10] và [170, 180].

Hãy thử điều này:

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

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

    Mat3b hsv; 
    cvtColor(bgr, hsv, COLOR_BGR2HSV); 

    Mat1b mask1, mask2; 
    inRange(hsv, Scalar(0, 70, 50), Scalar(10, 255, 255), mask1); 
    inRange(hsv, Scalar(170, 70, 50), Scalar(180, 255, 255), mask2); 

    Mat1b mask = mask1 | mask2; 

    imshow("Mask", mask); 
    waitKey(); 

    return 0; 
} 

kết quả trước đây của bạn:

enter image description here

Result thêm khoảng [170, 180]:

enter image description here


Một cách tiếp cận thú vị mà cần phải kiểm tra một loạt đơn duy nhất là:

  • đảo ngược hình ảnh BGR
  • chuyển đổi sang HSV
  • nhìn cho cyan màu

Ý tưởng này đã được được đề xuất bởi fmw42 và vui lòng chỉ ra bởi Mark Setchell. Cảm ơn bạn rất nhiều vì điều đó.

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

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

    Mat3b bgr_inv = ~bgr; 
    Mat3b hsv_inv; 
    cvtColor(bgr_inv, hsv_inv, COLOR_BGR2HSV); 

    Mat1b mask; 
    inRange(hsv_inv, Scalar(90 - 10, 70, 50), Scalar(90 + 10, 255, 255), mask); // Cyan is 90 

    imshow("Mask", mask); 
    waitKey(); 

    return 0; 
} 

enter image description here

+2

Chỉ cần một chút mẹo mát từ @ fmw42 mà tôi muốn chia sẻ ... bạn có thể đảo ngược hình ảnh và tìm kiếm cyans mà không quấn :-) http: // stackoverflow. com/a/43926013/2836621 –

+1

@MarkSetchell thông minh! Thêm vào câu trả lời với mã C++ để hoàn thành. Cảm ơn nhiều! – Miki

+0

Phản hồi của bạn cực kỳ hữu ích! Cảm ơn @Miki! – Luctheduke

Các vấn đề liên quan