opencv如何实现图片的透明背景显示?

Dr_FIA 2010-12-30 10:50:15
我把一幅透明背景的png图片读进来并显示,发现图片背景是白色而非透明,请问如何才能够使之显示透明背景,用哪些函数?
如果不能直接显示透明背景,是否可以使用mask方法,需要哪些函数?
ps:我没有使用opencv的GUI,我是在MFC框架下做的。
...全文
2514 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangpan697 2012-07-31
  • 打赏
  • 举报
回复
CString str,ss;
str = "f:\\loadimage\\loadimage\\1.jpg";
ss = "f:\\loadimage\\loadimage\\4.png";

IplImage *img = cvLoadImage(str,-1);
IplImage *img1 = cvLoadImage(ss,-1);
IplImage *mask = cvLoadImage(ss,0);

CvRect rect1=cvRect(0,0,img1->width,img1->height);
cvSetImageROI(img,rect1);
cvCopy(img1,img,mask);
cvResetImageROI(img);

cvNamedWindow("1",img);
cvShowImage("1",img);
cvReleaseImage(&img);
cvReleaseImage(&img1);
cvReleaseImage(&mask);
Bo_Lee 2012-03-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dizuo 的回复:]

png是支持透明通道的。
R G B A
在现实IplImage的地方,手工进行一下融合:
R = R * A;
G = G * A;
B = B * A;
试试最终效果、
[/Quote]

这个怎么实现?具体点,请教·······
Bo_Lee 2012-03-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 doox8086 的回复:]

对opencv 没啥研究..~
如果你不用第三方库 (opencv 是主在处理数据 , 输入输出采用接口式)
那就只得改 opencv 源代码了.
网上的说法,我copy一下....
C/C++ code

1. In grfmt_png.cpp, line 170 add a line that allows to push through the type (alpha chan……
[/Quote]
这个我试过了,没得用啊!
linfeng_hebut 2012-01-04
  • 打赏
  • 举报
回复
请问楼主是怎么实现的呢?介绍下吧,我现在也遇到这个问题
Dr_FIA 2010-12-31
  • 打赏
  • 举报
回复
决定用楼上给的这个函数了,多谢你了!
dooX8086 2010-12-30
  • 打赏
  • 举报
回复
对opencv 没啥研究..~
如果你不用第三方库 (opencv 是主在处理数据 , 输入输出采用接口式)
那就只得改 opencv 源代码了.
网上的说法,我copy一下....

1. In grfmt_png.cpp, line 170 add a line that allows to push through the type (alpha channel) detection:

// Allow for PNG alpha channel here

if(color_type == PNG_COLOR_TYPE_RGB_ALPHA) {

m_type = CV_8UC4;

}

2. In grfmt_png.cpp, around line 220 allow for an alpha channel by commenting the following statements:

//png_set_strip_alpha( png_ptr );

3. In loadsave.cpp , line 222 we finally tweak the parent routine to be more flexible towards the channels returned. Here we replace the "3" by CV_MAT_CN(type):

type = CV_MAKETYPE(CV_MAT_DEPTH(type), CV_MAT_CN(type));


(Note all changes were performed against OpenCV 2.0)



// 也就插入一行,注解一行, 修改一行.
// 重新编译 (如果你是使用 库 方式的话)
Dr_FIA 2010-12-30
  • 打赏
  • 举报
回复
我是用opencv 中的 cvloadimage 来加载png图片的,如果它不支持透明,我该用别的什么方法?
dooX8086 2010-12-30
  • 打赏
  • 举报
回复
你采用 opencv 函数加载图片还是mfc 加载图片!?..注意采用的channel

//opencv 中的 cvloadimage 默认好像不支持 alpha, 也就是 RGBA 会当作 RGB
ryfdizuo 2010-12-30
  • 打赏
  • 举报
回复
png是支持透明通道的。
R G B A
在现实IplImage的地方,手工进行一下融合:
R = R * A;
G = G * A;
B = B * A;
试试最终效果、
dooX8086 2010-12-30
  • 打赏
  • 举报
回复
http://blog.csdn.net/luhuillll/archive/2009/09/02/4512016.aspx
Dr_FIA 2010-12-30
  • 打赏
  • 举报
回复
谢谢ls回答,
那有没有什么方法能把IplImage对象转为MFC的CBitmap对象呢?
我主要是想吧opencv摄像头截取的IplImage帧和资源文件中的png图片融合,再显示到MFC图像控件上,
如果能转化为CBitmap,那对我来说就比较容易了。
dooX8086 2010-12-30
  • 打赏
  • 举报
回复
既然这样,你就不要用 opencv 的函数来 load png图片了.(不改源码,只能是RGB 后面的A 数据是没有的)
也可借助其它库如cximage..来加载, 再不就用mfc/系统api 来搞.
...再不就自己写个load函数,再据数据给IplImage
....GDI+
...
//总有一种合乎你心情的方法.
Dr_FIA 2010-12-30
  • 打赏
  • 举报
回复
ls的方法看的不是很懂,改opencv的库如果换到其他机器上就运行不了了吧?
而且我也不敢乱改人家的东西>_<
最好能用opencv现有的函数实现,像1L所说的手工融合好像很复杂,
实在不行像MFC的bitblt函数那样用MASK技术实现我也认了,大不了多PS几张mask图。。

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧