我最近开始学习图像处理,并通过做各种爱好项目来测试自己。因此,一个项目是利用实时摄像机反馈来检测旋转光束的转速。我用的是带摄像头的覆盆子圆周率。为了跟踪光束,我附加了一种颜色,我可以很容易地分辨出来。我成功地做到了这一点。其程序如下所示
import numpy as np
import cv2
cap = cv2.VideoCapture('video1.h264')
r = [290,560,5000,200]
lower = np.array([30,30,70])
upper = np.array([37,37,85])
while(cap.isOpened()):
ret, frame = cap.read()
if frame is not None:
imgcrop = frame[int(r[1]):int(r[1]+r[3]), int(r[0]):int(r[0]+r[2])]
hsv_img = cv2.cvtColor(imgcrop,cv2.COLOR_BGR2HSV)
mask = cv2.inRange(imgcrop, lower, upper)
kernel = np.ones((3,3), np.uint8)
img_erode = cv2.dilate(mask,kernel, iterations=10)
contours, hierarchy = cv2.findContours(img_erode, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
hull = []
for i in range(len(contours)):
hull.append(cv2.convexHull(contours[i], False))
drawing = np.zeros((img_erode.shape[0], img_erode.shape[1], 3), np.uint8)
for i in range(len(hull)):
M = cv2.moments(hull[i])
try:
cX = int(M["m10"] / M["m00"])
cY = int(M["m01"] / M["m00"])
cv2.circle(drawing, (cX, cY), 5, (255, 255, 255), -1)
except Exception as e:
print(e)
pass
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
通过上面的程序,我可以在图像上单独跟踪颜色,并绘制一个中心点。现在,我想用这些数据来计算rpm
我的想法是用三点法找到旋转的中心点,然后是半径
将该数据与V= r*W
一起使用,其中r是半径,V
是点的速度,计算W
,即光束的rpm是主要思想
但这是行不通的。我不知道如何继续下去。如果你能给我更好的指导,那将非常有用
摄像机设置如下所示:
Resolution : 1920X1080
FPS : 10
提前谢谢
如果更改代码以便记住以前的质心(仅
cX
)并计算帧之间质心的位移,您将看到它在正(向右移动时)和负(向左移动时)之间交替您可以使用以下方法获取自上次在正/负之间更改以来的时间(以秒为单位):
这告诉你半圈的时间,所以把它加倍,你就有了周期,可以计算rpm为
60/period
您可以忽略小位移,因此,如果车轮移动非常缓慢,它仍然可以工作
还可以通过对几个样本进行平均来平滑这些值
您还可以对
cY
值执行相同的操作,以提高准确性相关问题 更多 >
编程相关推荐