Je voudrais savoir comment dessiner des formes semi-transparentes dans OpenCV, similaires à celles de l'image ci-dessous (de http://tellthattomycamera.wordpress.com/ )
Je n'ai pas besoin de ces cercles fantaisistes, mais j'aimerais pouvoir dessiner un rectangle, par exemple, sur une image couleur à 3 canaux et spécifier la transparence du rectangle, quelque chose comme
rectangle (img, Point (100,100), Point (300,300), Scalar (0,125,125,0.4), CV_FILLED);
où 0,125,125
est la couleur du rectangle et 0.4
spécifie la transparence. Cependant OpenCV n'a pas cette fonctionnalité intégrée dans ses fonctions de dessin. Comment puis-je dessiner des formes dans OpenCV afin que l'image d'origine sur laquelle on dessine soit partiellement visible à travers la forme?
L'image ci-dessous illustre la transparence à l'aide d'OpenCV. Vous devez faire un mélange alpha entre l'image et le rectangle. Vous trouverez ci-dessous le code d'une façon de procéder.
#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);
}
Dans OpenCV 3, ce code a fonctionné pour moi:
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);
Source/Inspiré par: http://bistr-o-mathik.org/2012/06/13/simple-transparency-in-opencv/
Pour compléter la réponse d'Alexander Taubenkorb, vous pouvez dessiner des formes aléatoires (semi-transparentes) en remplaçant le cv::rectangle
ligne avec la forme que vous souhaitez dessiner.
Par exemple, si vous souhaitez dessiner une série de cercles semi-transparents, vous pouvez le faire comme suit:
cv::Mat source = cv::imread("IMG_2083s.png"); // loading the source image
cv::Mat overlay; // declaring overlay matrix, we'll copy source image to this matrix
double alpha = 0.3; // defining opacity value, 0 means fully transparent, 1 means fully opaque
source.copyTo(overlay); // copying the source image to overlay matrix, we'll be drawing shapes on overlay matrix and we'll blend it with original image
// change this section to draw the shapes you want to draw
vector<Point>::const_iterator points_it; // declaring points iterator
for( points_it = circles.begin(); points_it != circles.end(); ++points_it ) // circles is a vector of points, containing center of each circle
circle(overlay, *points_it, 1, (0, 255, 255), -1); // drawing circles on overlay image
cv::addWeighted(overlay, alpha, source, 1 - alpha, 0, source); // blending the overlay (with alpha opacity) with the source image (with 1-alpha opacity)