【问题标题】:Detecting the rpm of a wheel using Image Processing使用图像处理检测车轮的转速
【发布时间】: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


【解决方案1】:

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

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

cap.get(cv2.CAP_PROP_POS_MSEC)*1000

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

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

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

您也可以对cY 值执行相同操作以提高准确性。

【讨论】:

  • 感谢您提供此信息。我会试试这个!
猜你喜欢
  • 2020-05-08
  • 2021-01-03
  • 2023-02-16
  • 2016-12-25
  • 1970-01-01
  • 2022-01-25
  • 2015-11-09
  • 1970-01-01
  • 2021-05-08
相关资源
最近更新 更多