栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【OpenCV】C++简易实现绿色背景抠像

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【OpenCV】C++简易实现绿色背景抠像

要求:

将cat.jpg中猫放置到table.jpg中的桌子上

一开始我的想法是将cat.jpg中绿色部分变成透明,然后贴在table.jpg上,发现得要将图片改成png格式能增加一个表示透明度的通道,尝试过后发现达不到我的效果,不知道什么原因。后来我采用遍历cat.jpg,一个个像素替换的方法,发现比我预想简单许多。操作的时候,总会边缘有一圈绿色的抠不干净,改了几次限制条件还是不尽如人意,最后在网络上搜索了一下,说HSV的颜色空间对于绿色背景的筛选更加便当,于是将图片转化成HSV,效果还可以,比之前好很多。(代码部分opencv的头文件没有添加,用者记得加一下··)

 

int main(int argc, char** argv) {
	     Mat img1 = imread("C:/Users/WU/Desktop/数字图像处理/DIP实验2/cat.jpg");
	     Mat img2 = imread("C:/Users/WU/Desktop/数字图像处理/DIP实验2/table.jpg");
Mat img3;
cvtColor(img1, img3, COLOR_BGR2HSV); //将图像由RGB颜色模型转化为HSV颜色模型
	     Mat roi = img2(Rect(384, 210, img1.cols, img1.rows)); //在table.jpg中创建复制区域
	     for (int i = 0; i < img1.rows; i++)  //遍历cat.jpg中的像素
	     {
		     for (int j = 0; j < img1.cols; j++)
		     {
			     if(img3.at(i, j)[2] != 255 && img3.at(i, j)[0] < 50) //抠图限制条件
			     {
				    roi.at(i, j)[0] = img1.at(i, j)[0];
				    roi.at(i, j)[1] = img1.at(i, j)[1];
				    roi.at(i, j)[2] = img1.at(i, j)[2];
			     }
		     }
	    }
	    imshow("test",img2);
	    imwrite("cat on the table.jpg", img2);
	    waitKey(0);
	    destroyAllWindows();
return 0;
}

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/971534.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号