c++ - seguimiento - OpenCV mejor detección de color rojo?
opencv python tutorial español (1)
Tengo la siguiente imagen:
Me gustaría detectar el rectángulo rojo usando el método
cv::inRange
y el espacio de color 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 );
Ya he creado barras de seguimiento dinámicas para cambiar los valores de HSV, pero no puedo obtener el resultado deseado.
¿Alguna sugerencia para usar los mejores valores (y quizás filtros)?
En el espacio HSV, el color rojo se
ajusta
a 180. Por lo tanto, necesita que los valores
H
estén en [0,10] y [170, 180].
Prueba esto:
#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;
}
Tu resultado anterior:
Rango de adición de resultados [170, 180]:
Otro enfoque interesante que necesita verificar un solo rango es:
- invertir la imagen BGR
- convertir a HSV
- buscar color cian
Esta idea ha sido propuesta por fmw42 y señalada amablemente por Mark Setchell . Muchas gracias por eso.
#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;
}