如何创建半透明形状?

use*_*572 24 c++ opencv shape alpha-transparency

我想知道如何在OpenCV中绘制半透​​明的形状,类似于下图中的那些(来自http://tellthattomycamera.wordpress.com/)

在此输入图像描述

我不需要那些花哨的圆圈,但我希望能够绘制一个矩形,例如,在3通道彩色图像上,并指定矩形的透明度,类似于

rectangle (img, Point (100,100), Point (300,300), Scalar (0,125,125,0.4), CV_FILLED);
Run Code Online (Sandbox Code Playgroud)

0,125,125矩形的颜色在哪里,并0.4指定透明度.但是,OpenCV没有在其绘图功能中内置此功能.如何在OpenCV中绘制形状,以便绘制的原始图像通过形状部分可见?

Bul*_*ull 37

下图显示了使用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);
}
Run Code Online (Sandbox Code Playgroud)

  • @Prakash`roi`中的数据是`image`中数据的矩形切片.也就是说,如果您从`roi`读取,您正在读取`image`,如果您修改`roi`,您也在修改`image`. (3认同)
  • 感谢您的回复和耐心,但我使用addWeighted函数以另一种方式解决了这个问题.像这样:cap >> img; img.copyTo(copy); 矩形(复制,点(100,100),点(300.300),标量(0,125,125),CV_FILLED,CV_AA,0); addWeighted(copy,0.4,0.1到0 .4,0 img,img); imshow( "IMG",IMG); (2认同)
  • @Bull,我有一个查询,您未在`addWeighted`函数调用中使用`image` Mat对象,它如何更新为image?谢谢 (2认同)

Ale*_*orb 15

在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);
Run Code Online (Sandbox Code Playgroud)

来源/灵感来自:http://bistr-o-mathik.org/2012/06/13/simple-transparency-in-opencv/