opencv 将图片中白色部分转化为透明

yuanmoren 2011-05-18 01:36:42
opencv中文论坛好冷清呀!来这里转转。

vc6.0 + opencv1.0

我用CvvImage::Load加载图片,但是alpha channel被忽略了。
我想手动将其转化为RGBA,将白色的部分转化为透明的, 以下是我的实现代码


// m_cvImageSmall为待转化的图片
// m_p4Channel 为转化后的
IplImage *dst = 0;
CvSize dst_cvsize;

IplImage * src = m_cvImageSmall.GetImage();

dst_cvsize.width = src->width;
dst_cvsize.height = src->height;

dst = cvCreateImage( dst_cvsize, src->depth, 4);

int x;
int y;
uchar r, g, b;

for (y = 0; y < src->height; y++)
{
uchar *ptrSrc = (uchar*)(src->imageData + y * src->widthStep);
uchar *ptrDst = (uchar*)(dst->imageData + y * dst->widthStep);
for (x = 0; x < src->width; x++)
{
r = ptrSrc[3 * x];
g = ptrSrc[3 * x + 1];
b = ptrSrc[3 * x + 2];

ptrDst[4 * x] = r;
ptrDst[4 * x + 1] = g;
ptrDst[4 * x + 2] = b;

if (255 == r && 255 == g && 255 == b)//白色部分为透明
ptrDst[4 * x + 3] = 0;
else
ptrDst[4 * x + 3] = 255;

}
}

m_p4Channel = dst;


但是我把m_p4Channel画在界面上时,程序退出。

if (m_p4Channel)
{
CvvImage img;
img.CopyOf(m_p4Channel, 4);//---------------------这里出问题了。
CRect rc4Channel(0, 0, img.Width(), img.Height());
img.DrawToHDC(memDC.GetSafeHdc(), &m_rcCropDst);
}


应该还是透明处理出问题了吧。
我看不出哪里出问题。
请指教。
...全文
1366 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
wrp2003000 2012-04-25
  • 打赏
  • 举报
回复
m_p4Channel = dst; // 跟dst是局部变量有关
这句话换成下面的几句,应该可以:
m_p4Channel = cvCreateImage(cvGetSize(dst),dst->depth,dst->nChannels);
cvCopy(dst,m_p4Channel);
cvReleaseImage(&dst);
yuanmoren 2011-05-21
  • 打赏
  • 举报
回复
还是采用掩码的方式弄了
ryfdizuo 2011-05-19
  • 打赏
  • 举报
回复
代码风格挺好的,看不出有什么问题啊。
if (255 == r && 255 == g && 255 == b)//白色部分为透明
这里设个阈值好点。
yuanmoren 2011-05-19
  • 打赏
  • 举报
回复
自己顶

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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