2013-04-10 16 views
7

Su una cornice immagine, io usocv :: Scalar non mostrare il colore previsto

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)

per disegnare un'ellisse e voglio impostare il colore ellisse verde enter image description here [valore RGB: (165, 206 , 94)]. così mi sono messo il parametro const Scalar& color a

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 

Ho provato anche RGB alternativa.

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 

Ma il colore che viene visualizzato è bianco enter image description here [valore RGB (255, 255, 255)], non quella verde desideri.

Cosa mi è mancato a questo punto? Qualsiasi suggerimento per favore Grazie.

EDIT:

Mettiamola tutto il codice relativo qui. Secondo OpenCV iOS - Video Processing, questo è il CvVideoCamera configurazione in - (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]; 

Poi dopo [self.videoCamera start]; chiamata, il (Mat&)image sarebbe catturato e possono essere elaborati nel metodo CvVideoCameraDelegate - (void)processImage:(Mat&)image; e qui il codice per disegnare un'ellisse:

- (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); 

}

Infine, l'ellisse è ancora in bianco, non quella verde desideri.

+0

Controllare la parte restante del codice e accertarsi di non modificare il valore del colore da qualche altra parte. La porzione che hai fornito mostra perfettamente il colore verde previsto nella mia macchina. – Barshan

+2

forse hai un tipo di immagine float? che hanno un range di valori [0 1]? – mrgloom

+0

@Barshan Das Ho controllato e commentato il resto del codice ma il colore è rimasto lo stesso. Qual è il lavoro per te? – Protocole

risposta

2

Come mrgloom indica correttamente nel commento, potrebbe essere a causa del tipo di immagine [l'oggetto Mat in cui si desidera disegnare, cioè Mat & img nella funzione ellisse()]. cv :: Scalare (94, 206, 165) è il colore verde desiderato per le immagini di tipo 8UC3. L'impostazione di questi valori nell'immagine 32FC3 si tradurrà in un colore bianco.

+0

Scusate per favore chiariscimi. Ho 'image.type() = 24'. Questo risultato 'cv :: Scalar (94, 206, 165)' nel colore bianco? Se sì, quale tipo di immagine Mat dovrei convertire per ottenere il colore verde corretto? Posso semplicemente usare 'src.convertTo (dst, );'? Grazie. – Protocole

+0

sì, è possibile convertire lo src con la funzione convertTo. Mostra il codice di come stai creando la matrice src. – Barshan

+0

Ho provato a convertire il tipo di immagine senza fortuna. Si prega di consultare il codice relativo nell'edizione. Grazie ancora. – Protocole

1

è possibile utilizzare

src.convertTo (src, CV_8UC3);

Dove CV_8UC3 significa che si utilizzano 8 caratteri senza segno e 3 immagini a colori. Ulteriori informazioni potete trovare qui OpenCV docs dopo che l'ellisse dovrebbe essere verde, se non aiuta a postare l'intero codice.

+0

Ho provato la tua risposta senza successo. Si prega di consultare l'intero codice correlato nell'edizione. Grazie. – Protocole

0

Avevo problemi simili e sono riuscito a risolverlo convertendo prima l'immagine in BGR.Quindi nel tuo caso la funzione processImage sarà simile come:

-(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); 
} 

L'unica linea che ho inserito nel codice è:

cvtColor(image, image, CV_RGBA2BGR); 

Se si accede anche canali, la profondità e digitare le informazioni in quanto sopra funzione come segue:

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()); 

si vedrà prima della conversione:

channels 4 
depth 0 
type 24 
element size 4 

che credo sia CV_8UC4 e dopo la conversione diventa:

channels 3 
depth 0 
type 16 
element size 3 

che è CV_8UC3.

Immagino che una delle ragioni per cui non funziona senza cvtColor è che le funzioni di disegno opencv non supportano la trasparenza alfa quando l'immagine di destinazione è 4 canali come menzionato in opencv documentation. Quindi convertendo CV_RGBA2BGR eliminiamo il canale alfa. Tuttavia dopo aver detto che io non sono riuscito a farlo funzionare se faccio:

cvtColor(image, image, CV_RGBA2RGB); 

In questo Rosso e blu i colori sono invertiti nell'immagine. Quindi anche se sembra funzionare, ma non sono sicuro se sia la vera ragione.

9

Impostare alfa su 255 può risolvere questo problema. Scalare (94,206,165,255)

+0

spiegare per favore. – Irfan

+1

Non so come ma questo ha funzionato per me. – bakalolo