当前位置:   article > 正文

【OpenCV】C++简易实现绿色背景抠像_opencv c c++ 图片抠图换背景

opencv c c++ 图片抠图换背景

要求:

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

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

 

  1. int main(int argc, char** argv) {
  2. Mat img1 = imread("C:/Users/WU/Desktop/数字图像处理/DIP实验2/cat.jpg");
  3. Mat img2 = imread("C:/Users/WU/Desktop/数字图像处理/DIP实验2/table.jpg");
  4. Mat img3;
  5. cvtColor(img1, img3, COLOR_BGR2HSV); //将图像由RGB颜色模型转化为HSV颜色模型
  6. Mat roi = img2(Rect(384, 210, img1.cols, img1.rows)); //table.jpg中创建复制区域
  7. for (int i = 0; i < img1.rows; i++) //遍历cat.jpg中的像素
  8. {
  9. for (int j = 0; j < img1.cols; j++)
  10. {
  11. if(img3.at<Vec3b>(i, j)[2] != 255 && img3.at<Vec3b>(i, j)[0] < 50) //抠图限制条件
  12. {
  13. roi.at<Vec3b>(i, j)[0] = img1.at<Vec3b>(i, j)[0];
  14. roi.at<Vec3b>(i, j)[1] = img1.at<Vec3b>(i, j)[1];
  15. roi.at<Vec3b>(i, j)[2] = img1.at<Vec3b>(i, j)[2];
  16. }
  17. }
  18. }
  19. imshow("test",img2);
  20. imwrite("cat on the table.jpg", img2);
  21. waitKey(0);
  22. destroyAllWindows();
  23. return 0;
  24. }

 

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

闽ICP备14008679号