2014-06-29 12 views
16

Vorrei sapere come disegnare forme semitrasparenti in OpenCV, simili a quelle nell'immagine qui sotto (da http://tellthattomycamera.wordpress.com/)Come creare una forma semi trasparente?

enter image description here

Non ho bisogno di quei cerchi di fantasia, ma vorrei essere in grado di disegnare un rettangolo, ad esempio, immagine a colori a 3 canali su e specificare la trasparenza del rettangolo, qualcosa come

rectangle (img, Point (100,100), Point (300,300), Scalar (0,125,125,0.4), CV_FILLED); 

dove 0,125,125 è il colore del rettangolo e 0.4 specifica i tras cy. Tuttavia OpenCV non ha questa funzionalità integrata nelle sue funzioni di disegno. Come posso disegnare forme in OpenCV in modo che l'immagine originale che viene disegnata sia parzialmente visibile attraverso la forma?

risposta

29

L'immagine seguente illustra la trasparenza utilizzando OpenCV. Devi fare una fusione alfa tra l'immagine e il rettangolo. Di seguito è riportato il codice per un modo per farlo.

enter image description here

#include <opencv2/core/core.hpp> 
#include <opencv2/highgui/highgui.hpp> 

int main(int argc, char** argv) 
{ 
    cv::Mat image = cv::imread("IMG_2083s.png"); 
    cv::Mat roi = image(cv::Rect(100, 100, 300, 300)); 
    cv::Mat color(roi.size(), CV_8UC3, cv::Scalar(0, 125, 125)); 
    double alpha = 0.3; 
    cv::addWeighted(color, alpha, roi, 1.0 - alpha , 0.0, roi); 

    cv::imshow("image",image); 
    cv::waitKey(0); 
} 
+2

Grazie per la risposta e per la vostra pazienza, ma ho risolto in un altro modo, usando la funzione addWeighted. In questo modo: cap >> img; img.copyTo (copia); Rettangolo (copia, punto (100,100), punto (300,300), scalare (0,125,125), CV_FILLED, CV_AA, 0); addWeighted (copia, 0.4, da 0.1 a 0 .4,0 img, img); imshow ("img", img); – user3788572

+1

@Bull, ho avuto una query, non stai usando l'oggetto 'image' Mat nella chiamata alla funzione' addWeighted', come si aggiorna all'immagine? Grazie –

+2

@Prakash I dati in 'roi' sono una sezione rettangolare dei dati in' immagine'. Cioè, se leggi da 'roi' stai leggendo da' image', se modifichi 'roi' stai anche modificando' image'. – Bull

8

In OpenCV 3 di questo codice ha funzionato per me:

cv::Mat source = cv::imread("IMG_2083s.png"); 
cv::Mat overlay; 
double alpha = 0.3; 

// copy the source image to an overlay 
source.copyTo(overlay); 

// draw a filled, yellow rectangle on the overlay copy 
cv::rectangle(overlay, cv::Rect(100, 100, 300, 300), cv::Scalar(0, 125, 125), -1); 

// blend the overlay with the source image 
cv::addWeighted(overlay, alpha, source, 1 - alpha, 0, source); 

Fonte/Ispirato da: http://bistr-o-mathik.org/2012/06/13/simple-transparency-in-opencv/

Problemi correlati