2014-06-29 9 views
16

Ich würde gerne wissen, wie halbtransparente Formen in OpenCV zu ziehen, ähnlich denen im Bild unten (von http://tellthattomycamera.wordpress.com/)Wie erstelle ich eine halbtransparente Form?

enter image description here

ich, nicht jene Phantasie Kreise brauchen, aber ich möchte zu können, um ein Rechteck, beispielsweise auf einer 3-Kanal-Farbbild und gibt die Transparenz des Rechtecks, so etwas wie

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

wo 0,125,125 ist die Farbe des Rechtecks ​​und 0.4 zeichnen gibt die transparen Cy. OpenCV hat diese Funktionalität jedoch nicht in seine Zeichenfunktionen integriert. Wie kann ich Formen in OpenCV zeichnen, so dass das ursprüngliche Bild, das gezeichnet wird, teilweise durch die Form sichtbar ist?

Antwort

29

Das Bild unten veranschaulicht Transparenz mit OpenCV. Sie müssen eine Alpha-Mischung zwischen dem Bild und dem Rechteck erstellen. Unten ist der Code für eine Möglichkeit, dies zu tun.

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

Danke für die Antwort und für Ihre Geduld, aber ich löste es auf andere Weise mit der Funktion addWeighted. So: Kappe >> img; img.copyTo (Kopie); Rechteck (Kopie, Punkt (100,100), Punkt (300,300), Skalar (0,125,125), CV_FILLED, CV_AA, 0); addWeighted (Kopie, 0,4, 0,1 bis 0,40 img, img); imshow ("img", img); – user3788572

+1

@Bull, ich hatte eine Abfrage, Sie verwenden nicht 'Image' Mat Objekt in' addWeighted' Funktionsaufruf, wie wird es auf Bild aktualisiert? Danke –

+2

@Prakash Die Daten in 'roi' sind eine rechteckige Scheibe der Daten in' image'. Das heißt, wenn Sie von 'roi' lesen, lesen Sie von' image', wenn Sie 'roi' modifizieren, ändern Sie auch' image'. – Bull

8

In OpenCV 3 dieser Code für mich gearbeitet:

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

Quelle/Inspiriert von: http://bistr-o-mathik.org/2012/06/13/simple-transparency-in-opencv/

Verwandte Themen