当前位置:   article > 正文

OPENCV对于有alpha通道的透明背景图片的读取和图片叠加_opencv读取透明底图

opencv读取透明底图

这个是我自己做的粗略的螺旋丸的图,导出为png并带有alpha通道。

最后和一只狗合成成这个样子。

效果还是可以的。

为了实现这个效果,首先我们要明白具有透明通道的图片的opencv的读取方式。在OpenCV里,正常是读取图像和写入图像默认都是忽略透明通道的,如果想要读取原图像中的透明通道,则在使用imread()函数时,后面的参数要使用CV_LOAD_IMAGE_UNCHANGED参数或是直接写-1也可以。比如:

  1. Mat inimg = imread("dog.png", CV_LOAD_IMAGE_UNCHANGED); // 读取透明通道
  2. // 输出RGBA数值
  3. cout << (int)inimg.at<Vec4b>(0,0)[0] << endl
  4. << (int)inimg.at<Vec4b>(0,0)[1] << endl
  5. << (int)inimg.at<Vec4b>(0,0)[2] << endl
  6. << (int)inimg.at<Vec4b>(0,0)[3] << endl;
这样我们读取的图片就有了四个通道,也就是BGRA四个通道,第四个就是Alpha通道,这个通道通过0-255的数值来代表该像素的透明度。

我通过split函数分解矩阵的通道把png图片分解为B1矩阵,G1矩阵,R1矩阵,A1矩阵把背景图片分解为了B0矩阵,G0矩阵,R0矩阵。于是叠加的结果:令alpha = A1 , 令beta = 255 - alpha。
  1. #include <vector>
  2. #include <stdio.h>
  3. #include <opencv2/opencv.hpp>
  4. using namespace cv;
  5. using namespace std;
  6. int cvAdd4cMat_q(cv::Mat &dst, cv::Mat &scr, double scale);
  7. int main()
  8. {
  9. char str[16];
  10. Mat img1 = imread("bk.jpg"), img2 = imread("img.png", -1);
  11. Mat img1_t1(img1, cvRect(0, 0, img2.cols, img2.rows));
  12. cvAdd4cMat_q(img1_t1,img2,1.0);
  13. imshow("final",img1);
  14. waitKey(0);
  15. return 0;
  16. }
  17. int cvAdd4cMat_q(cv::Mat &dst, cv::Mat &scr, double scale)
  18. {
  19. if (dst.channels() != 3 || scr.channels() != 4)
  20. {
  21. return true;
  22. }
  23. if (scale < 0.01)
  24. return false;
  25. std::vector<cv::Mat>scr_channels;
  26. std::vector<cv::Mat>dstt_channels;
  27. split(scr, scr_channels);
  28. split(dst, dstt_channels);
  29. CV_Assert(scr_channels.size() == 4 && dstt_channels.size() == 3);
  30. if (scale < 1)
  31. {
  32. scr_channels[3] *= scale;
  33. scale = 1;
  34. }
  35. for (int i = 0; i < 3; i++)
  36. {
  37. dstt_channels[i] = dstt_channels[i].mul(255.0 / scale - scr_channels[3], scale / 255.0);
  38. dstt_channels[i] += scr_channels[i].mul(scr_channels[3], scale / 255.0);
  39. }
  40. merge(dstt_channels, dst);
  41. return true;
  42. }
最终使用这个方法,可以到达前图的效果。




声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/128802
推荐阅读
相关标签
  

闽ICP备14008679号