OpenCV读取PNG图片叠加显示在另一张图片上,始终会有底色存在的解决方法

问题描述

我在QT界面中使用opencv读取PNG图片,并将他显示在另一张已经创建好的Mat背景下时,出现了图片背景后始终会有杂乱的方块格子显示。

所以我开始了检索,通过检索发现可能是读取的时候没有将图片的透明通道读取进来,并且你的背景也应该有透明通道,才能使该透明的地方透明,该有色彩的地方有色彩。所以我采用了以下代码,来读取图片并显示。

  // 读取图片
  cv::Mat image = cv::imread("truck.png", cv::IMREAD_UNCHANGED);

  if (image.empty()) {
    std::cerr << "Error: Could not read the image." << std::endl;
    return -1;
  }
  cv::resize(image, image, cv::Size(100, 150));

  cv::Mat target_image(300, 300, CV_8UC4, cv::Scalar(255, 0, 2550));

  // 设置图片在窗口中的位置和大小
  cv::Rect roi_rect(0, 0, image.cols, image.rows);  // 起始点的x坐标,y坐标,宽度,高度
  cv::Mat roi = target_image(roi_rect);

  image.copyTo(roi);

上面的代码是网络给的标准答案,但是我运行过后,还是PNG图像周围还是会有底色,而不是透明的。


解决方案:

最终通过检索,我的解决方案是将PNG的图片的四个通道全部分离开来,然后按照图像通道再赋值给要覆盖的背景的Mat上,运行之后发现可以解决问题。

void drawTransparency(cv::Mat& frame, cv::Mat& transp, int xPos, int yPos) {
    cv::Mat mask;
    std::vector<cv::Mat> layers;
    
    split(transp, layers);
    std::cout << "size: " << layers.size() << std::endl;
    cv::Mat rgb[3] = { layers[0],layers[1],layers[2] };
    mask = layers[3]; 
    merge(rgb, 3, transp);
    transp.copyTo(frame(cv::Rect(xPos, yPos, transp.cols, transp.rows)), mask);
}
  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值