当前位置: 首页 > 知识库问答 >
问题:

java opencv png图像与alpha通道视频问题

霍襦宗
2023-03-14

每个人我试图使用java和opencv将“.png”图像置于视频捕获之上。

我从opencv java官方网站上执行了教程http://opencv-java-tutorials.readthedocs.io/en/latest/04-opencv-basics.html

在本教程中,使用本教程中的png图像,一切都很好。但当我尝试用alpha通道加载自己的png图像时,我得到了错误的结果。Png图像显示为空白。

这两个屏幕上的图像都是打印的:

正确输出

输出不正确

我的png图像

这是加载图像的代码:

@FXML
protected void loadLogo() {
    if(logoCheckBox.isSelected()) {
        this.logo = Imgcodecs.imread("resources/Poli.png", Imgcodecs.IMREAD_COLOR);
    }
}

这是视频捕获和放置png图像的代码:

Mat frame = new Mat();

// read the current frame
this.capture.read(frame);
Rect roi = new Rect(frame.cols() - logo.cols(), frame.rows() - logo.rows(), logo.cols(), logo.rows());
Mat imageROI = frame.submat(roi);

Core.addWeighted(imageROI, 1.0, logo, 1.0f, 0.0, imageROI);

以下是输出图像在ImageView中的放置方式:

MatOfByte buffer = new MatOfByte();
Imgcodecs.imencode(".png", frame, buffer);
Image imageToShow = new Image(new ByteArrayInputStream(buffer.toArray()));
Image imageToShow = Utils.mat2Image(frame);
currentFrame.setImage(imageToShow);

我知道参数Imgcodecs。IMREAD_彩色加载图像,有3个通道,没有alpha,但当我将此参数更改为IMREAD_UNCHANGED时,我得到了以下错误:

OpenCV错误:输入参数的大小不匹配(操作既不是“数组op array”(其中数组的大小和通道数相同)

出现这种情况是因为带有视频捕获的输入垫仅包含3个通道。

我的问题是:如何在视频捕获上正确加载和放置png图像?

P. S当我用黑色填充png图像的背景时,它的显示是正确的,但图像仍然保持透明。

共有1个答案

金飞翼
2023-03-14

答案是RGBA图像不能放置在RGB视频捕获之上。仅放置png图像的RBG组件会产生“错误结果”。

目前,我找到的最好的解决方案是在RBGA模式下加载png图像,使用4个通道,使用第4个alpha通道,并将其用作显示图像的遮罩,使用函数“copyTo”而不是“addWeighted”。

但这种方法不适用于PNG图像的半透明部分,如阴影和低不透明度的对象。

下面是使用单独的RGB和alpha通道加载图像的代码:

Mat logo = new Mat();
Mat logo_alpha = new Mat();
Mat logo_with_alpha = Imgcodecs.imread("resources/TREE_1.png", Imgcodecs.IMREAD_UNCHANGED);         
Vector<Mat> rgba = new Vector<Mat>();
// split RBGA image for separate channels
Core.split(logo_with_alpha, rgba);
// get alpha channel
logo_alpha = rgba.get(3);
// remove alpha channel to get RGB image
rgba.remove(rgba.size()-1);
// get image with only RGB components
Core.merge(rgba, this.logo);

以下是视频捕获和在其上放置png图像的代码:

Mat frame = new Mat();
// read the current frame
this.capture.read(frame);
Rect roi = new Rect(frame.cols() - logo.cols(), frame.rows() - logo.rows(), logo.cols(), logo.rows());
Mat imageROI = frame.submat(roi);
// place logo with alpha on the frame
logo.copyTo(imageROI, logo_alpha);
 类似资料:
  • 问题内容: 使用opencv在python中将RGB图像转换为RGBA的最佳方法是什么? 假设我有一个形状数组 另一个是带有形状的alpha蒙版 如何合并它们并保存到文件? 问题答案: 您可以用来将Alpha通道添加到给定的RGB图像,但是首​​先需要按照文档将RGB图像拆分为通道: Python:cv2.merge(mv [,dst]) mv –要合并的矩阵的输入数组或向量;mv中的所有矩阵必须

  • 我需要提取5年前公司YouTube频道上的活动。我遇到了一个YouTube分析API的问题,因为它限制了我最近30天的活动。我正在考虑接下来尝试YouTube数据API V3,但我想首先在这里问一下,是否有人知道如何从YouTube频道中提取深层历史数据。我感兴趣的主要是每天每个视频的浏览量。我正在使用谷歌云平台,需要将数据存储在BigQuery中。 https://developers.goog

  • 正在尝试从图像(1080p.png)音乐(320kbmp3)为youtube制作视频。 但转化是缓慢的。有什么想法吗,它是如何使优化的<代码>E:\U测试

  • 9.19线下一面 约30min 1.自我介绍 2.科研项目(原理,方法,结果对比,算法提升等) 3.实习经历(就在vivo工具组实习的,mtk视频算法,自动化调试原理,个人的主要工作和贡献) 4.反问 9.21 线下hr面 约20min 1.自我介绍 2.你在工具组实习的感受,和上司冲突怎么办 3.讲讲你对手机影像的理解(镜头,sensor,算法等) 4.你对你面试官的印象怎么样(一面的面试官可能

  • 我想在背景图像上覆盖透明视频。我有一个视频,其中上半部分是RGB对象,下半部分是阿尔法掩码。 现在,为了制作这个,我执行以下步骤:

  • 其他工具或简单的API也是受欢迎的。 我有一个序列的png与alpha,我想覆盖在一些视频的顶部。使用ffmpeg会很棒,但是使用imagemagick也是可以接受的。我可以提取视频中的所有帧,并使用imagemagick批量混合每一帧,然后重新编码(重新编码是可以接受的)。