利用图像处理技术检测车轮转速

2024-06-06 06:36:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近开始学习图像处理,并通过做各种爱好项目来测试自己。因此,一个项目是利用实时摄像机反馈来检测旋转光束的转速。我用的是带摄像头的覆盆子圆周率。为了跟踪光束,我附加了一种颜色,我可以很容易地分辨出来。我成功地做到了这一点。其程序如下所示

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 

提前谢谢


Tags: 项目程序img颜色npcv2frame摄像机
1条回答
网友
1楼 · 发布于 2024-06-06 06:36:39

如果更改代码以便记住以前的质心(仅cX)并计算帧之间质心的位移,您将看到它在正(向右移动时)和负(向左移动时)之间交替

您可以使用以下方法获取自上次在正/负之间更改以来的时间(以秒为单位):

cap.get(cv2.CAP_PROP_POS_MSEC)*1000

这告诉你半圈的时间,所以把它加倍,你就有了周期,可以计算rpm为60/period

您可以忽略小位移,因此,如果车轮移动非常缓慢,它仍然可以工作

还可以通过对几个样本进行平均来平滑这些值

您还可以对cY值执行相同的操作,以提高准确性

相关问题 更多 >