cv :: Scalar no muestra el color esperado

En un marco de image, uso

void ellipse(Mat& img, Point center, Size axes, double angle, double startAngle, double endAngle, const Scalar& color, int thickness=1, int lineType=8, int shift=0)

para dibujar una elipse y quiero establecer el color de la elipse en verde introduzca la descripción de la imagen aquí [Valor RGB: (165, 206, 94)]. Así que establezco el parámetro const Scalar& color para

 cv::Scalar(94.0, 206.0, 165.0, 0.0); // as BGR order, suppose the value is 0.0 - 255.0 cv::Scalar(94.0/255.0, 206.0/255.0, 165.0/255.0, 0.0); // suppose the value is 0.0 - 1.0 

También probé la alternativa RGB.

 CV_RGB(165.0, 206.0, 94.0); // as RGB order, suppose the value is 0.0 - 255.0 CV_RGB(165.0/255.0, 206.0/255.0, 94.0/255.0); // suppose the value is 0.0 - 1.0 

Pero el color que se muestra es blanco introduzca la descripción de la imagen aquí [Valor RGB (255, 255, 255)], no el verde deseado.

¿Qué me perdí en este momento? Cualquier sugerencia por favor. Gracias.

EDITAR:

Permítanme poner aquí el código completo. De acuerdo con OpenCV iOS – Procesamiento de video , esta es la configuration de CvVideoCamera - (void)viewDidLoad; :

 self.videoCamera = [[CvVideoCamera alloc] initWithParentView:imgView]; [self.videoCamera setDelegate:self]; self.videoCamera.defaultAVCaptureDevicePosition = AVCaptureDevicePositionFront; self.videoCamera.defaultAVCaptureSessionPreset = AVCaptureSessionPreset352x288; self.videoCamera.defaultAVCaptureVideoOrientation = AVCaptureVideoOrientationPortrait; self.videoCamera.defaultFPS = 30; self.videoCamera.grayscaleMode = NO; [self.videoCamera adjustLayoutToInterfaceOrientation:UIInterfaceOrientationPortrait]; 

Luego, después de [self.videoCamera start]; llamada, la image (Mat&)image sería capturada y se puede procesar en el método CvVideoCameraDelegate - (void)processImage:(Mat&)image; y aquí está el código para dibujar una elipse:

 - (void)processImage:(Mat&)image { NSLog(@"image.type(): %d", image.type()); // got 24 // image.convertTo(image, CV_8UC3); // try to convert image type, but with or without this line result the same NSLog(@"image.type(): %d", image.type()); // also 24 cv::Scalar colorScalar = cv::Scalar( 94, 206, 165 ); cv::Point center( image.size().width*0.5, image.size().height*0.5 ); cv::Size size( 100, 100 ); cv::ellipse( image, center, size, 0, 0, 360, colorScalar, 4, 8, 0 ); 

}

Eventualmente, la elipse todavía está en blanco, no la verde deseada.

Establecer alfa a 255 puede solucionar este problema. Escalar (94,206,165,255)

Como mrgloom apunta correctamente en el comentario, puede ser debido al tipo de tu image [el object Mat donde quieres dibujar, es decir Mat & img en elipse () function]. cv :: Scalar (94, 206, 165) es el color verde deseado para imágenes de tipo 8UC3. Establecer estos valores en la image 32FC3 dará como resultado un color blanco.

puedes usar

src.convertTo (src, CV_8UC3);

Donde CV_8UC3 significa que usa caracteres de 8 bits sin signo y 3 imágenes en color. Más información puede encontrar aquí los documentos de OpenCV después de que su elipse debe ser verde, si no ayuda a publicar el código completo.

Estaba teniendo un problema similar y he logrado solucionarlo convirtiendo primero la image en BGR. Entonces, en su caso, la function processImage se vería así:

 -(void)processImage:(Mat&)image { cvtColor(image, image, CV_RGBA2BGR); cv::Scalar colorScalar = cv::Scalar( 94, 206, 165 ); cv::Point center( image.size().width*0.5, image.size().height*0.5 ); cv::Size size( 100, 100 ); cv::ellipse( image, center, size, 0, 0, 360, colorScalar, 4, 8, 0 ); } 

La única línea que he incluido en su código es:

 cvtColor(image, image, CV_RGBA2BGR); 

Si también registra información de canal, profundidad y tipo en la function anterior de la siguiente manera:

 NSLog(@"Before conversion"); NSLog(@"channels %d", image.channels()); NSLog(@"depth %d", image.depth()); NSLog(@"type %d", image.type()); NSLog(@"element size %lu", image.elemSize()); cvtColor(image, image, CV_RGBA2BGR); NSLog(@"After conversion"); NSLog(@"channels %d", image.channels()); NSLog(@"depth %d", image.depth()); NSLog(@"type %d", image.type()); NSLog(@"element size %lu", image.elemSize()); 

Verás antes de la conversión:

 channels 4 depth 0 type 24 element size 4 

que creo que es CV_8UC4 y después de la conversión se convierte en:

 channels 3 depth 0 type 16 element size 3 

que es CV_8UC3.

Supongo que una de las razones por las que no funciona sin cvtColor es que las funciones de dibujo opencv no son compatibles con la transparencia alfa cuando la image de destino es de 4 canales como se menciona en la documentation de opencv . Entonces, al convertir CV_RGBA2BGR, eliminamos el canal alfa. Sin embargo, haber dicho que no consigo que funcione si lo hago:

 cvtColor(image, image, CV_RGBA2RGB); 

En este rojo y azul, los colors se invierten en la image. Por lo tanto, aunque parece funcionar pero no estoy seguro de si es la razón real.