精华内容
下载资源
问答
  • Python使用OpenCV绿幕图片进行抠图并生成带有透明通道的PNG图片

    原图片
    在这里插入图片描述
    带有透明通道的图片(在浏览器状态下透明背景呈现白色)
    在这里插入图片描述Python完整代码如下,具体实现流程代码注释已经解释很清楚了,详情请看注释

    import cv2
    import numpy as np
    
    # todo 读取并转换图片格式
    opencv = cv2.imread('/home/huangjx/Pictures/boy.jpeg')
    hsv = cv2.cvtColor(opencv, cv2.COLOR_RGB2HSV)
    
    # todo 指定绿色范围,60表示绿色,我取的范围是-+10
    minGreen = np.array([50, 100, 100])
    maxGreen = np.array([70, 255, 255])
    
    # todo 确定绿色范围
    mask = cv2.inRange(hsv, minGreen, maxGreen)
    
    # todo 确定非绿色范围
    mask_not = cv2.bitwise_not(mask)
    
    # todo 通过掩码控制的按位与运算锁定绿色区域
    green = cv2.bitwise_and(opencv, opencv, mask=mask)
    
    # todo 通过掩码控制的按位与运算锁定非绿色区域
    green_not = cv2.bitwise_and(opencv, opencv, mask=mask_not)
    
    # todo 拆分为3通道
    b, g, r = cv2.split(green_not)
    
    # todo 合成四通道
    bgra = cv2.merge([b, g, r, mask_not])
    
    # todo 保存带有透明通道的png图片,有了这种素材之后,就可以给这张图片替换任意背景了
    cv2.imwrite('/home/huangjx/Pictures/boy.png', bgra)
    
    # todo 显示图片验证结果,opencv LOGO 图片
    cv2.imshow('opencv', opencv)
    cv2.imshow('green', green)
    cv2.imshow('green_not', green_not)
    cv2.waitKey()
    cv2.destroyAllWindows()
    
    

    再放一张效果图片吧
    原图:在这里插入图片描述
    结果:
    在这里插入图片描述从这组图片对比可以看出来,这种方法对边缘的扣取效果还是不够完美。

    但是如果你对HSV格式比较熟悉的话,你更改下面的值,理论上可以扣取任意颜色背景的图片(例如背景是紫色你也能搞定),这就是PS做不到的优势了

    # todo 指定绿色范围,60表示绿色,我取的范围是-+10
    minGreen = np.array([50, 100, 100])
    maxGreen = np.array([70, 255, 255])
    
    展开全文
  • python-opencv绿幕抠图

    千次阅读 2017-05-04 19:11:48
    参考 ... Python源码#!/usr/bin/env python import cv2 import numpy img=cv2.imread('223.png',1)# opencv 将BGR 转换成 HSV imgHSV=cv2.cvtColor(img,cv2.CO

    参考

    http://blog.csdn.net/happy_frank/article/details/46684719

    Python源码

    #!/usr/bin/env python
    
    import cv2
    import numpy
    
    img=cv2.imread('223.png',1)
    # opencv 将BGR 转换成 HSV
    imgHSV=cv2.cvtColor(img,cv2.COLOR_BGR2HSV) 
    for i in range(img.shape[0]):
      for j in range(img.shape[1]):
    #判断是否绿色 50和75参数可以改变 应该不是最好
        if imgHSV[i,j,0]<75 and imgHSV[i,j,0]>50:
          img[i,j]=[255,255,255]
    cv2.namedWindow('Image',cv2.WINDOW_NORMAL)
    cv2.imshow('Image',img)
    cv2.waitKey(0)
    cv2.destoryAllWindows()

    展开全文
  • opencv 绿背景抠图

    千次阅读 2016-06-04 14:14:24
    opencv 绿背景抠图 标签: opencv绿背景抠图chromakeyHSVHSL 2014-08-06 16:56 1638人阅读 评论(3) 收藏 举报 本文章已收录于: 分类: opencv进化之旅(13) 作者同类文章X ...
    opencv 绿背景抠图  
    
    标签: opencv绿背景抠图chromakeyHSVHSL
    1638人阅读 评论(3) 收藏 举报
    本文章已收录于:
    分类:

      ps:写之前废话一下,到新公司刚刚好一个月了,公司是一家外企,和上海这边迪士尼合作,到新公司是做图形处理相关的项目,今天终于做完了第一个接手的项目,绿背景抠图,从完全不知道到完成第一个项目,瞬间有了一点点成就的感觉。

     绿背景抠图:

    1.绿背景相片

    2.制作掩图


    3,利用mask图来扣除图片中的人物


    先来说一下思路吧。

      我们利用循环找图片中绿色的像素。

      把绿色标记为(0,0,0),把要扣出来的前景标记为(255,255,255),这样我们就能制作出掩图(mask图)。

     利用copyTo调用mask图作为参数扣出前景。


    代码就不上,由于是公司的项目。再说也不是很难。小小提示下,如何寻找图中绿色的像素是关键和处理绿色像素,如果一种方法不理想,可以转换到其他颜色空间,rgb到hsv、hls、lab等等其他颜色空间试试就好了。

    0
    0
     
     

    我的同类文章

    参考知识库

    更多资料请参考:
    猜你在找
    HTML 5移动开发从入门到精通
    iOS移动开发从入门到精通(Xcode7 & Swift2)
    Android必备的Java基础知识
    老郭全套iOS开发课程【UI技术】
    PDF神器-Adobe Acrobat Pr
    android-opencv undefined reference to
    opencv21移植arm 出现找不到libcvso not found try using -rpath or -rpath-link 及大量 undefined reference的解决
    linux 下安装opencv30在编译时出现的问题undefined reference to parallel_pthreads_set_threads_numint
    Linux 编译报错 -- undefined reference to 问题解决方法 具体pthread_create和opencv看文章最后两条
    Linux 编译报错 -- undefined reference to 问题解决方法 具体pthread_create和opencv看文章最后两条
    查看评论
    2楼 sx23202320 昨天 14:36发表 [回复] [引用] [举报]
    您好,请问该如何确定图像中的绿色像素的位置呢?
    比如RGB中绿色像素的范围是多少之类的,求指点,感激不尽!
    1楼 smallk2013 2015-04-23 22:15发表 [回复] [引用] [举报]
    可以说一下方法吗?绿色我扣不完整,就是有一些留下,达不到你的效果。
    邮箱oc_co@qq.com
    Re: chenxun2009 2015-04-24 10:41发表 [回复] [引用] [举报]
    回复smallk2013:你从头仔细阅读我的博文,好好的去测试,写代码。多测试,相信你能按照文中提供的思想能解决问题的。


    展开全文
  • opencv 绿幕背景视频抠图

    千次阅读 2019-04-28 22:10:57
    在视频中采用KMeans或者GMM的算法效率太低了,用来做视频抠图效果不好,这里使用了一个更加便捷的方式。就是HSV格式。 由于在视频中只有的绿色的背景和前景的人物,且将HSV归一化为: H 0 - 180 S 0 - 255 V 0 - 255...

    一、说明

    在视频中采用KMeans或者GMM的算法效率太低了,用来做视频抠图效果不好,这里使用了一个更加便捷的方式。就是HSV格式。
    由于在视频中只有的绿色的背景和前景的人物,且将HSV归一化为:

    H 0 - 180
    S 0 - 255
    V 0 - 255
    

    所以在HSV格式中绿色的范围是:

    H 35 - 155
    S 43 - 255
    V 46 - 255
    

    具体步骤如下:

    1. 帧图像;
    2. 转化为HSV;
    3. 模型mask;
    4. 背景融合替换;
    5. 显示帧图像;
    6. 下一帧;
    7. 完成。

    过程中需要注意的是,背景与视频中的人物和背景在读取元素的时候需要保持一致,不然达不到效果。另外就是需要融合的图像的背景大小要与视频的大小一致。

    二、程序实例

    #include <opencv2/opencv.hpp>
    #include <iostream>
    
    using namespace cv;
    using namespace std;
    using namespace ml;
    
    const char* title = "input video";
    const char* result_win = "result video";
    Mat background_01, background_02;
    
    Mat replace_and_blend(Mat& frame, Mat& mask)
    {
    	Mat result = Mat::zeros(frame.size(), frame.type());
    	int h = frame.rows;
    	int w = frame.cols;
    	int dims = frame.channels();
    
    	int m = 0;
    	double wt = 0; // 混合权重
    	int r = 0, g = 0, b = 0;
    	int r1 = 0, g1 = 0, b1 = 0;
    	int r2 = 0, g2 = 0, b2 = 0;
    	
    	for (int row = 0; row < h; row++)
    	{
    		uchar* current = frame.ptr<uchar>(row); // 当前帧图像
    		uchar* bgrow = background_01.ptr<uchar>(row); // 背景当前行
    		uchar* maskrow = mask.ptr<uchar>(row);
    		uchar* targetrow = result.ptr<uchar>(row);
    		
    		for (int col = 0; col < w; col++)
    		{
    			m = *maskrow++;
    			if (m == 255) // 背景
    			{
    				*targetrow++ = *bgrow++;
    				*targetrow++ = *bgrow++;
    				*targetrow++ = *bgrow++;
    				current += 3; // 当前帧,背景,前景要保持一致
    			}
    			else if (m == 0) // 前景
    			{
    				*targetrow++ = *current++;
    				*targetrow++ = *current++;
    				*targetrow++ = *current++;
    				bgrow += 3; // 当前帧,背景,前景要保持一致
    			}
    			else
    			{
    				b1 = *bgrow++;
    				g1 = *bgrow++;
    				r1 = *bgrow++;
    
    				b2 = *current++;
    				g2 = *current++;
    				r2 = *current++;
    
    				wt = m / 255.0;
    
    				b = b1 * wt + b2 * (1.0 - wt);
    				g = g1 * wt + g2 * (1.0 - wt);
    				r = r1 * wt + r2 * (1.0 - wt);
    
    				*targetrow++ = b;
    				*targetrow++ = g;
    				*targetrow++ = r;
    			}
    		}
    	}
    
    	return result;
    }
    
    int main()
    {
    	background_01 = imread("D:/source/images/bg2.png"); //注意图片的大小与视频一致
    	background_02 = imread("D:/source/images/sky.png");
    	VideoCapture capture;
    	capture.open("D:/source/images/01.mp4");
    
    	if (!capture.isOpened())
    	{
    		puts("could not find the video file");
    		system("pause");
    		return -1;
    	}
    
    	namedWindow(title, WINDOW_AUTOSIZE);
    	namedWindow(result_win, WINDOW_AUTOSIZE);
    
    	Mat frame, hsv, mask;
    	int count = 0;
    	while (capture.read(frame))
    	{
    		cvtColor(frame, hsv, COLOR_BGR2HSV);
    		inRange(hsv, Scalar(35, 43, 46), Scalar(155, 255, 255), mask); 
    
    		// 形态学操作
    		Mat k = getStructuringElement(MORPH_RECT, Size(3, 3));
    		morphologyEx(mask, mask, MORPH_CLOSE, k);
    		erode(mask, mask, k);
    		GaussianBlur(mask, mask, Size(3, 3), 0, 0);
    		
    		Mat result = replace_and_blend(frame, mask);
    		
    		char c = waitKey(1);
    		if (c == 27) break;
    
    		imshow(result_win, result);
    		imshow(title, frame);
    	}
    
    	waitKey(0);
    	return 0;
    }
    

    三、结果展示

    需要融合的背景图片:
    在这里插入图片描述
    视频(这里只能是静态图片了):
    在这里插入图片描述
    融合后的效果:
    融合后的效果

    展开全文
  • 通过OpenCV对视频进行绿幕抠图效果代码1、打开视频素材2、保存视频路径及格式设置3、读取一帧视频4、寻找绿幕背景5、融合6、代码执行效果 效果 今天跟大家分享的是最近比较受大家喜欢的视频或图片的部分场景抠图...
  • unity 绿幕抠图

    2017-08-01 12:57:07
    一款很好用的绿幕抠图插件
  • 通过OpenCV对视频进行绿幕抠图,适合图像处理、视频制作等相关专业人员
  • 我们在看电影的时候会发现许多很震撼的特效,而在拍摄这些特效时,他们都在一个很大的绿幕中进行,接下来我们来将绿幕的图像进行抠图操作!It is amazing!~ import cv2 image = cv2.imread("images/green_screen....
  • Unity3d绿幕抠图源码

    2017-04-14 11:12:17
    Unity3d绿幕实时抠图源码,类似于拍摄电影中的绿幕拍摄
  • 目前实现效果如下图: [img=https://img-bbs.csdn.net/upload/201705/02/1493705955_792320.jpg]... 实现方法是像素检测到绿色,就替换成背景色。 这种方法实现的效果不好,人的边缘部分还有绿色,头发也少了一些!
  • 摘要:本文介绍了一种使用OpenCVSharp对摄像头中的绿幕视频进行实时“抠人像、替换背景”的方式,对于项目中的算法进行了分析。本文中给出了简化OpenCVSharp中Mat、MatE...
  • 一、证件照背景替换 实现流程: ...opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; class Machine_learning{ public: void void replace_bg_demo
  • opencv 实现绿幕背景 视频抠图

    千次阅读 2019-12-26 17:11:58
    #include <...#include "opencv2/opencv.hpp" using namespace cv; using namespace std; const char* title="input video"; const char* resultWin="result voide"; Mat background_01; M...
  • android opencv交互式抠图-附件资源
  • 今天我们使用opencv代码的方式实现图像抠图。 用到的函数主要有:cv.inRange(src, lowerb, upperb),cv.bitwise_not(),cv.bitwise_and()。 cv.inRange(src, lowerb, upperb):函数的功能是根据像素的范围进行过滤...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,108
精华内容 843
关键字:

opencv绿幕抠图