python-2.7 - python opencv HSV 测距仪创建轨迹栏

标签 python-2.7 image-processing opencv3.0 hsv

我想使用 opencv 和 python 查找激光点的 HSV 值。我得到了代码 http://opencv-srf.blogspot.com.au/2010/09/object-detection-using-color-seperation.html从这里开始,但它是在 c++ 中,安装 visual studio 和 opencv 需要时间,所以我更改了 python 中的代码

import cv2
import numpy as np

def callback(x):
pass

cap = cv2.VideoCapture(0)
cv2.namedWindow('image')

ilowH = 0
ihighH = 179

ilowS = 0
ihighS = 255
ilowV = 0
ihighV = 255

# create trackbars for color change
cv2.createTrackbar('lowH','image',ilowH,179,callback)
cv2.createTrackbar('highH','image',ihighH,179,callback)

cv2.createTrackbar('lowS','image',ilowS,255,callback)
cv2.createTrackbar('highS','image',ihighS,255,callback)

cv2.createTrackbar('lowV','image',ilowV,255,callback)
cv2.createTrackbar('highV','image',ihighV,255,callback)



while(1):
 ret, frame = cap.read()
 hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
 cv2.imshow('hsv', hsv)
 lower_hsv = np.array([ilowH, ilowS, ilowV])
 higher_hsv = np.array([ihighH, ihighS, ihighV])
 mask = cv2.inRange(hsv, lower_hsv, higher_hsv)
 cv2.imshow('mask', mask)
 cv2.imshow('frame', frame)
 print ilowH, ilowS, ilowV
 if(cv2.waitKey(1) & 0xFF == ord('q')):
    break


cv2.destroyAllWindows()
cap.release()

但是这段代码没有任何阈值。看起来我创建的轨迹栏不会改变 ilowH 、 ilowS 、 ilowV 的值。我通过在 while 循环中打印这些值来检查它。没有对这些值中的任何一个进行阈值处理可能是什么问题,或者在 python 中是否有更好的代码来查找激光的 HSV 值。 谢谢您,我们将不胜感激。

最佳答案

您可以使用 cv2.getTrackbarPos() 获取轨迹栏值。另请注意,有时它会使轨迹栏乱序,这很烦人,但至少它们被标记了。

但是,我认为这些轨迹条对于实时视频输入来说效果不是很好。有很多卡住问题。你必须有一个超低的帧率(如果你真的想显示它,我可以使用 cv2.waitKey(500))。这主要是由于 trackbars 吸吮,而不是阈值操作,后者并不那么慢。

您需要在创建命名窗口后添加您的轨迹栏。然后,对于你的 while 循环,尝试:

while True:
    # grab the frame
    ret, frame = cap.read()

    # get trackbar positions
    ilowH = cv2.getTrackbarPos('lowH', 'image')
    ihighH = cv2.getTrackbarPos('highH', 'image')
    ilowS = cv2.getTrackbarPos('lowS', 'image')
    ihighS = cv2.getTrackbarPos('highS', 'image')
    ilowV = cv2.getTrackbarPos('lowV', 'image')
    ihighV = cv2.getTrackbarPos('highV', 'image')

    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    lower_hsv = np.array([ilowH, ilowS, ilowV])
    higher_hsv = np.array([ihighH, ihighS, ihighV])
    mask = cv2.inRange(hsv, lower_hsv, higher_hsv)

    frame = cv2.bitwise_and(frame, frame, mask=mask)

    # show thresholded image
    cv2.imshow('image', frame)
    k = cv2.waitKey(1000) & 0xFF # large wait time to remove freezing
    if k == 113 or k == 27:
        break

最后以 cv2.destroyAllWindows()

结束文件

顺便说一句,HSV 的最大 H 值是 180,而不是 179。

无耻的插件:我碰巧刚完成一个项目正是这样做,但在图像上。你可以在 GitHub 上获取它 here .有一个例子;尝试运行它,然后根据需要进行修改。它会让你改变每个不同颜色空间内的颜色空间和阈值,它会打印你结束的最终阈值。此外,它还会返回操作的输出图像供您使用。希望它对你有用!欢迎通过 GitHub 为项目发送任何问题或建议。

这是它运行的例子:

Example of cspaceThresh running

作为输出,它给你:

Colorspace: HSV 
Lower bound: [68.4, 0.0, 0.0] 
Upper bound: [180.0, 255.0, 255.0]

以及二进制图像。我目前也在努力将其纳入 Web 应用程序,但这可能要过几天才能完成。

关于python-2.7 - python opencv HSV 测距仪创建轨迹栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44480131/

相关文章:

python - python - 如何按两列或多列对python pandas中的dataFrame进行排序?

python - 无法导入名称收缩

python - 如何跟踪 Flask 中 route 每个函数所花费的时间?

matlab - 根据两个垂直 View 的图像生成图像

opencv - WPF 的 Macbeth ColorChecker

android - 这段代码在这个 OpenCV Android 示例应用程序中做了什么?

python - 使用生成器发送方法。仍在尝试理解发送方法和古怪的行为

c++ - Opencv hough圆圈未检测到圆圈

python - 使用 waitKey 时为 "Attempt to unlock mutex that was not locked Aborted"

opencv3.0 - 为什么要包含 opencv2 目录中的 opencv 头文件?