Opencv贴图的两种方式

来源:互联网 发布:mbd.baidu.com短域名 编辑:程序博客网 时间:2024/06/05 08:18

白底不贴,遍历像素时,若为白色,则忽略,否则将像素值复制到背景上
因为目标图片中可能含有白色点,并且对抠出的图片要求挺高的不然就会出现第二幅图的效果,所以这种方式局限性较大。

void Drawtoback(Mat image, Mat background, int y, int x){    for (int i = 0; i < image.rows; i++)    {        for (int j = 0; j < image.cols; j++)        {            int a = image.at<Vec3b>(i, j)[2];            int b = image.at<Vec3b>(i, j)[1];            int c = image.at<Vec3b>(i, j)[0];            if (!(a == 255 && b == 255 && c == 255))            {                <>background.at<Vec3b>(i + x, j + y)[2] = image.at<Vec3b>(i, j)[2];                <>background.at<Vec3b>(i + x, j + y)[1] = image.at<Vec3b>(i, j)[1];                <>background.at<Vec3b>(i + x, j + y)[0] = image.at<Vec3b>(i, j)[0];            }        }    }}
//透明底不贴,通过将图片保存为含有四通道的png格式,判断alpha值!=0,不贴透明底 void Drawtoback(Mat image, Mat background, int y, int x){    for (int i = 0; i < image.rows; i++)    {        for (int j = 0; j < image.cols; j++)        {            if (image.at<Vec4b>(i, j)[3] != 0)            {                background.at<Vec3b>(i + x, j + y)[2] = image.at<Vec4b>(i, j)[2];                background.at<Vec3b>(i + x, j + y)[1] = image.at<Vec4b>(i, j)[1];                background.at<Vec3b>(i + x, j + y)[0] = image.at<Vec4b>(i, j)[0];            }        }    }}

将一个目标物体贴在选定的背景上这里介绍两种方式,其实实质是相同的。用抠图软件将图像抠出,
第一种是将图像存于一张白底的背景上
第二种是透明背景的png格式
贴图之后的效果如下:
白底VS透明背景
白色背景贴图
透明背景贴图

0 0
原创粉丝点击