OpenCV绘制半透明效果的代码

  与网上大多数不同的是,本博贴出的代码,不仅经过测试运行,还检查结果是否正确。以这里代码为例,与网上不同的是:

  1. 专门区分了源图的透明度和子图的透明度。因为源图的透明度不为1,整体画面就会变暗。
  2. 专门对子图进行了清理动作。否则转成图片之后,会发现图片的顶部总是会有乱纹。

  代码如下: 

//为什么要区分?因为ALPHA_SOURCE!=1,那么画面变灰,效果不如人意。具体可以自己体验

#define  ALPHA_SOURCE       1
#define  ALPHA_POLYGON      0.5

void AlphaImage(IplImage* pImage, int x, int y, int width, int height)
{
    CvScalar color;
    color.val[0] = 0xFF;
    color.val[1] = 0;
    color.val[2] = 0;
    color.val[3] = 0;

    IplImage * pTemp=cvCreateImage(cvSize(width,height), pImage->depth, pImage->nChannels);
    //把图设置为空。
    cvSet(pTemp, CV_RGB(0,0,0), NULL);
    //根据需要,是否要填充
    cvRectangle(pTemp, cvPoint(0,0), cvPoint(width,height), color, -1);

    cvSetImageROI(pImage, cvRect(x, y, width, height));
    //注意两个Alpha的不同。
    cvAddWeighted(pImage, ALPHA_SOURCE, pTemp, ALPHA_POLYGON, 0.0, pImage);
    cvResetImageROI(pImage);

    //释放内存
    cvReleaseImage(&pTemp);
}

//由一个char*转换为IplImage
//SIZE_RGB=3
int create_image(const char* pRgbData, const int width, const int height)
{
    CvSize size;
    size.width = width;
    size.height= height;

    IplImage* iplImage = cvCreateImageHeader(size, IPL_DEPTH_8U, SIZE_RGB);
    //注意,这里只能是size.width,不能再加上height
    cvSetData(iplImage, pRgbData, size.width*SIZE_RGB);

    AlphaImage(iplImage...);
}

 

OpenCV中,要在一个图像上画一个半透明的椭,你需要使用位运算函数和颜色混合技术。由于OpenCV本身不直接支持透明度(Alpha通道),所以我们需要结合使用一些方法来创建半透明效果。以下是一个基本的步骤说明,展示如何在OpenCV中实现这个功能: 1. 创建一个带有Alpha通道的空白图像(或使用图像的Alpha通道,如果支持)。 2. 在这个空白图像上绘制你的椭,使用你想要的填充颜色和一个具有透明度的颜色。 3. 使用混合操作将这个椭图像与原始图像合并。 下面是一个简单的代码示例,演示如何绘制一个半透明的椭: ```python import cv2 import numpy as np def draw_transparent_ellipse(image, center, axes, angle, start_angle, end_angle, color, thickness, alpha): # 创建一个与输入图像大小相同的带有Alpha通道的空白图像 overlay = np.zeros((image.shape[0], image.shape[1], 4), dtype=np.uint8) # 在空白图像上绘制(使用cv2.FILLED) cv2.ellipse(overlay, center, axes, angle, start_angle, end_angle, color, thickness, cv2.FILLED) # 设置Alpha通道(透明度) overlay[..., 3] = alpha * 255 # 应用混合操作将椭图像与原始图像合并 result = cv2.addWeighted(image, 1.0, overlay, alpha, 0) return result # 加载或创建一个图像 image = cv2.imread('path_to_image.jpg') # 替换为你的图像路径 # 绘制半透明的参数 center = (100, 100) # 椭中心坐标 axes = (50, 30) # 椭的长轴和短轴 angle = 0 # 旋转角度 start_angle = 0 # 起始角度 end_angle = 360 # 结束角度 color = (255, 0, 0) # RGB颜色 thickness = 2 # 椭线宽 alpha = 0.5 # 透明度(0到1之间) # 绘制半透明 result_image = draw_transparent_ellipse(image, center, axes, angle, start_angle, end_angle, color, thickness, alpha) # 显示结果图像 cv2.imshow('Transparent Ellipse', result_image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 请注意,这个例子假设你已经有了一个可以工作的OpenCV环境,并且熟悉基本的OpenCV操作。此外,`alpha`值设置为0到1之间,0表示完全透明,1表示完全不透明。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柳鲲鹏

能给阁下一点帮助,非常荣幸

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值