利用opencv+python实现以下功能:
1)获取实时视频,分解帧频;
2)将视频做二值化处理;
3) 将视频做滤波处理(去除噪点,获取准确轮廓个数);
4)识别图像轮廓;
5)计算质心;
6)描绘质心动态变化曲线;
# -*- coding: utf-8 -*-
"""
Created on Thu Apr 24 12:10:23 2018
@author: irene
"""
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import spline
import math as mt
import cv2
cap = cv2.VideoCapture('1.avi') #读入视频
c=1
plt.figure(figsize=(8,8),dpi=80)
aa =[]
bb =[]
cc =[]
#uing = np.logspace(-3,2,121)
while(cap.isOpened()):
ret, frame = cap.read()
#分解为一帧一帧图像
if ret == True:
#cv2.imshow("frame",image)
img=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) #彩色转灰度
# print(frame)
ret,thresh= cv2.threshold(img,127,255,0) #二值化
image,contours,hierarchy = cv2.findContours(thresh, 3, 1)
img = cv2.medianBlur(image,5) #进行中值滤波
cnt = contours[1] #选取其中的第一个轮廓,这幅图像只有两个轮廓
M = cv2.moments(cnt)
cX=int(M["m10"]/M["m00"]) #计算质心
cY=int(M["m01"]/M["m00"])
cv2.drawContours(img,contours,-1,(0,255,0),2)
cv2.circle(img,(cX,cY),7,(255,255,255),-1)
cv2.putText(img,"",(cX-20,cY-20),
cv2.FONT_HERSHEY_SIMPLEX,0.5,(255,255,255),2)
cv2.imshow("img",img)
cv2.imwrite('img/'+str(c) + '.jpg',frame) #存储为图像
# for u in uing:
aa.append(cX)
bb.append(cY)
cc.append(c)
# plt.plot(c,cX,'k-')
#plt.plot(c,cX,color='red',linewidth=2.5,linestyle=':')
# plt.plot(c,cX,'k^')
#plt.plot(c,cY,'yo:')
c = c+1
else:
break
# cv2.imshow('frame',gray) #显示标记后的图像q
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
c1=np.var(aa)
c2=np.var(bb)
c1_1=c1/720*2.3*mt.pi/180
c1_2=c2/512*2.3*mt.pi/180
print(c1_1)
print(c1_2)
plt.plot(cc,aa)
plt.show()
plt.plot(cc,bb)
plt.show()
cv2.findContours()报错ValueError: not enough values to unpack (expected 3, got 2),应该将opencv升级或降级为3。
OpenCV2和OpenCV4中:findContours这个轮廓提取函数会返回两个值:①轮廓的点集(contours);②各层轮廓的索引(hierarchy)。 OpenCV3中:则会返回三个值: ①处理的图像(image);②轮廓的点集(contours);③各层轮廓的索引(hierarchy)。
cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)三个参数:
①第一个参数:寻找轮廓的图像;
②第二个参数表示轮廓的检索模式,有四种: cv2.RETR_EXTERNAL 只检测外轮廓 cv2.RETR_LIST 检测的轮廓不建立等级关系 cv2.RETR_CCOMP 建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息 cv2.RETR_TREE 建立一个等级树结构的轮廓;
③第三个参数method为轮廓的近似办法: cv2.CHAIN_APPROX_SIMPLE 压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标(矩形只需四顶点) cv2.CHAIN_APPROX_TC89_L1 使用teh-Chinl chain 近似算法 CV_CHAIN_APPROX_TC89_KCOS cv2.CHAIN_APPROX_NONE 存储所有的轮廓点,相邻的两个点的像素位置差不超过1。
转自https://www.cnblogs.com/guobin-/p/10842486.html