当opencv遇上打篮球
前言
这一段时间没怎么写博客,偶尔写一次也是比较正经的博客,感觉自己都不正常了。今天看课的时候突然来了灵感,那就整个烂活玩一玩。
打篮球配上rgb显示是一种什么体验呢,来试试。
内容
首先我们需要一个打篮球的视频,你猜是哪个打篮球视频。
想要完成的功能就是像下图这样,在视频中把一个人的轮廓画出来,然后随着视频一起播放。画的轮廓如下图
接下来就可以聊聊解决思路了。
第一步其实先把图像给整成灰度图,直接使用opencv的cvtColor函数即可
为了方便提取人物的轮廓,我们需要做一下二值处理,这里使用的函数是threshold,这个函数中会设置一个的阈值,当像素值超过这个阈值时,会直接将像素值设置为我们预定的像素值,当小于阈值时,则会将像素值设置为0,这样就可以得到下面这张图
相对于原视频,这个时候的图像已经很清楚的展示出了我们需要的内容,并且很容易就可以提取出轮廓
这之后,再将轮廓画在视频上就可以了
接下来就可以开始搞代码了
实现
完整代码如下
import numpy as np
from 图像识别 import picutils
import cv2
# 读取视频
cap = cv2.VideoCapture('cxk.mp4')# 设置标志位 超过5就变色
m =0while(1):
m +=1# 颜色数组的下标
l =0# 颜色数组 实现rgb变化效果
colos =[[0,0,255],[0,255,0],[255,0,0]]# frame存储每一帧的图像
ret, frame = cap.read()# 转换为灰度图
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 二值处理 这里的阈值设置为130可能不是最好的,可以试着再改改 超过130就会变255,否则就是0,从而实现二值图像的生成
thresh = cv2.threshold(gray,130,255, cv2.THRESH_BINARY)[1]# 边缘检测,检测出边缘方便轮廓提取
edged = cv2.Canny(thresh,75,150)# 获取所有的轮廓,这里没有在进行处理,有兴趣可以提取出需要的
cnts = cv2.findContours(edged, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]# 设置一个白板图片,作为人物的背景板
back = np.zeros((480,720,3), dtype="uint8")+255# 展示5帧修改一次颜色数组的下标 l就是下标值if m ==5:
l =(l +1)%3
m=0# 把轮廓绘制在白色的背景板上
cv2.drawContours(back, cnts,-1, colos[l],3)
cv2.imshow('frame', back)
k = cv2.waitKey(60)&0xff# 等待退出键,就可以直接退出if k ==27:break
cap.release()
cv2.destroyAllWindows()
成果
最后生成的图像如下图所示
毕竟谁能拒绝一个有rgb变换效果的男人呢
弄的很粗糙,刚刚接触opencv,以后再改进
版权归原作者 小王不头秃 所有, 如有侵权,请联系我们删除。