【问题标题】:OpenCV draw line doesn't work on transparent imageOpenCV画线不适用于透明图像
【发布时间】:2021-02-08 08:12:04
【问题描述】:

我正在制作一个绘图程序,您可以稍后将更改保存并导出为图像。不透明图像选项可以完美运行,但透明选项不能。我现在的代码基于this post

每当我在透明选项中画一条线时,图像上都不会显示任何内容。它是完全透明的。

print("Transparent:", str(transparent))
    if not transparent:
        image = np.zeros((height, width, 3), np.uint8) # initialize image for saving preferences
        image[:] = backgroundColorBGR # change background color

        for drawing in drawings: # loop through each drawing
            cv2.line(image, drawing[0], drawing[1], drawing[2], thickness = drawing[3]) # create line that user drew
        cv2.imwrite("yourimage.png", image)
    else:
        
        image = np.zeros((height, width, 4), dtype = np.uint8) # 4 channels instead of 3, for transparent images

        for drawing in drawings: # loop through each drawing
            cv2.line(image, drawing[0], drawing[1], drawing[2], thickness = drawing[3])
        cv2.imwrite("yourimage.png", image)

【问题讨论】:

  • 尝试将color=(b,g,r,a) 添加到cv2.line() 的参数中。我的意思是特别是 4 个值,所以你包括透明度/alpha。使a 等于255。或者尝试拆分通道并将前3 个绘制为BGR,将最后一个绘制为灰度,然后与np.dstack() 重新组合。
  • 非常感谢您的帮助!请将此作为答案,因为我知道这会对其他人有所帮助。
  • 我没有测试过这个,所以我不愿意把它作为答案。如果您成功了,请成为我的客人并将您的代码添加为答案,接受您自己的答案并获得积分。祝你好运!

标签: python opencv image-processing transparency


【解决方案1】:

感谢 Mark Setchell,我找到了一个可行的解决方案。在cv2.line()color 参数中,传递一个元组,其中前三个值是BGR 颜色。第四个值用于透明度/alpha。因此,如果您想在透明图像上绘图,您的代码应该类似于 cv2.line(color=(0, 0, 200, 255)) # etc

【讨论】:

    【解决方案2】:

    OpenCV 绘图功能非常有限,仅用于图像中的简单标记。

    它们不支持图像透明度的概念。例如,line 方法理解两种模式:三通道(彩色线)或非三通道(灰度线)。就是这样。

    结果是,在您的情况下,将相同的值写入所有四个通道。黑线应保持不可见,而白线或蓝线应以白线结束。

    参考:Source code of the method

    【讨论】:

    • 感谢您的帮助,但我发现这篇在 C++ 中使用 OpenCV 的帖子正是我想要的:stackoverflow.com/a/23131198/14270319。我只是不知道如何将其翻译成 Python。
    • 感谢您的反馈。我再次查看了代码,我查找的源代码是非抗锯齿线。别名版本确实支持四个通道(参见github.com/opencv/opencv/blob/…)。
    猜你喜欢
    • 1970-01-01
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 2023-03-06
    • 2015-04-16
    • 2014-06-01
    相关资源
    最近更新 更多