【发布时间】:2020-12-22 08:02:43
【问题描述】:
我最近开始学习图像处理,并通过做各种爱好项目来测试自己。所以一个项目是关于使用实时相机反馈来检测旋转光束的转速。我正在使用带有附加摄像头的树莓派。为了跟踪光束,我附上了一种我可以轻松区分的颜色。我成功地做到了这一点。程序如下。
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()
使用上面的程序,我可以单独跟踪图像上的颜色并绘制它的中心点。现在,我想用这个数据来计算转速。
我的想法是使用三点法找到旋转的中心点,然后是半径。
将此数据与 V= r*W 一起使用,其中 r 是半径,V 是点的速度,主要思想是计算 W ,即光束的 rpm。
但这不起作用。我不知道如何进一步进行。如果您能给我更好的指导,那将非常有用。
相机设置如下:
Resolution : 1920X1080
FPS : 10
提前致谢
【问题讨论】:
-
你能分享你的视频吗? Dropbox、Google Drive 等。
-
“这不起作用”不是一个非常有用的描述。 10fps也是一个相当低的帧速率。你的 rpm 值是多少?
-
@Piglet rpm 大约为 60。我需要使用 10 fps 因为树莓相机如果设置为全分辨率,则只能达到 15 fps。
-
一种方法如下:跟踪彩色区域的质心;随着时间的推移,它的 x 坐标将形成一个正弦曲线(y 坐标也是如此)。使用此信号的 FFT,您可以找出它的频率。
-
除非你可以确定颜色已经移动过了一个位置并返回到相同的位置。我不够聪明,无法弄清楚哈哈......如果你在计算旋转,那么你就不能每次它经过并且经过的时间和它在一分钟内经过的次数就是rpm不确定你需要关心帧,因为帧等于时间过去。但我可能是错的。如果可能的话,我会先在轮子上画一个点。照我说的做。让我们知道您的进展情况
标签: python python-3.x opencv image-processing raspberry-pi3