我想知道如何在OpenCV中绘制半透明的形状,类似于下图中的那些(来自http://tellthattomycamera.wordpress.com/)
我不需要那些花哨的圆圈,但我希望能够绘制一个矩形,例如,在3通道彩色图像上,并指定矩形的透明度,如
rectangle (img, Point (100,100), Point (300,300), Scalar (0,125,125,0.4), CV_FILLED);
其中0,125,125
是矩形的颜色,0.4
指定透明度。
但是,OpenCV没有在其绘图功能中内置此功能。如何在OpenCV中绘制形状,以便绘制的原始图像通过形状部分可见?
答案 0 :(得分:35)
下图显示了使用OpenCV的透明度。您需要在图像和矩形之间进行Alpha混合。下面是一种方法的代码。
#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);
}
答案 1 :(得分:13)
在OpenCV 3中,这段代码对我有用:
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);
来源/灵感:http://bistr-o-mathik.org/2012/06/13/simple-transparency-in-opencv/
答案 2 :(得分:0)
对于C ++,我个人很喜欢用于标量乘法和矩阵加法的重载运算符的可读性:
... same initial lines as other answers above ...
// blend the overlay with the source image
source = source * (1.0 - alpha) + overlay * alpha;