如何使用OpenCV读取传统温度计

如何使用OpenCV读取传统温度计,opencv,Opencv,我是OpenCV新手,正在寻找使用计算机视觉读取传统温度计的最佳方法的方向。有任何指导、一般方法、示例代码吗?谢谢你对这个非常广泛的问题的考虑 因此,我想更具体地说,如何将轮廓缩小到您感兴趣的区域,例如仅在附加图像中的数字周围设置边界框。谢谢你的考虑。[1] :“温度计” 是的,这很一般。我不知道什么是计算机视觉,但我猜是某种软件在观察温度计 所以首先考虑一下这个软件能理解什么。我猜它会随着颜色的变化而变化。所以你应该能够知道什么时候颜色从红色变为白色(或者当温度计不是红色时是什么)。该程序可能

我是OpenCV新手,正在寻找使用计算机视觉读取传统温度计的最佳方法的方向。有任何指导、一般方法、示例代码吗?谢谢你对这个非常广泛的问题的考虑

因此,我想更具体地说,如何将轮廓缩小到您感兴趣的区域,例如仅在附加图像中的数字周围设置边界框。谢谢你的考虑。[1] :“温度计”


是的,这很一般。我不知道什么是计算机视觉,但我猜是某种软件在观察温度计

所以首先考虑一下这个软件能理解什么。我猜它会随着颜色的变化而变化。所以你应该能够知道什么时候颜色从红色变为白色(或者当温度计不是红色时是什么)。该程序可能足够聪明,也可能不够聪明,无法读取指示温度计温度的数字(我假设这是一个垂直温度计)。如果#写在玻璃或曲面上,软件可能无法读取。然而,如果是白色背景上的黑色字母,你可能会很幸运。然后你能找到离红色变为白色最近的地方吗?如果没有,您可能需要提前校准与不同高度相关的温度。在这种情况下,您将基本上忽略编写的,并将它们硬编码到您的程序中


祝你好运

假设它是静态图像,您可以计算x像素=y度的比例。或者,大概。。。您可以通过简单的颜色检测来检测水银的高点,将图像转换为hsv,在范围内过滤以只留下红色,然后找到最小的y值并对照您的刻度进行检查

假设y轴上的每个x数量的像素都等于y度,则查找数字要比检测并读取数字容易得多。虽然,为了回答您的问题,因为您的数字是恒定的,我建议围绕数字和模板匹配的已知位置进行裁剪,但这仍然是毫无意义的,因为数字不会改变,所以您可以对位置进行硬编码


或者,如果是真实情况,可以使用数字温度计并通过模板匹配检测lcd数字,或者将温度计连接到计算机。

您最好缩小范围,否则它肯定会因为太宽而关闭。一个你想看的温度计图像会有帮助,还有一些你已经尝试过的想法,以及为什么它们不起作用。多少手工工作是可以的?如果视图是静态的,例如,用户可以标记温度计的上限和下限,并将温度值设置为这些边界?在这种情况下,读取温度计的任务减少到读取“红线”的位置,这可能由HSV颜色分类完成。
import cv2
import numpy as np

img = cv2.imread('thermometer.jpg')

gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
gray = cv2.bilateralFilter(gray, 11, 17, 17)
edges = cv2.Canny(gray,50,150,apertureSize = 3)

contours,hierarchy = cv2.findContours(edges,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
keys = [i for i in range(48,58)]
#cnts = sorted(contours, key = cv2.contourArea, reverse = True)[:10]
for cnt in contours:
    #if cv2.contourArea(cnt)>50:
    [x,y,w,h] = cv2.boundingRect(cnt)

    cv2.rectangle(img,(x,y),(x+w,y+h),(0,0,255),2)
    roi = img[y:y+h,x:x+w]
    roismall = cv2.resize(roi,(10,10))
    cv2.imshow('norm',img)
    key = cv2.waitKey(0)

cv2.imwrite('houghlines3.jpg',edges)