python opencv HSV 测距仪创建轨迹栏
python opencv HSV range finder creating trackbars
我想使用 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 中是否有更好的代码来查找 LASER 的 HSV 值。
谢谢,感谢您的帮助。
您可以使用 cv2.getTrackbarPos()
获取轨迹栏值。另请注意,有时它会使轨迹栏乱序,这很烦人,但至少它们被标记了。
但是,我认为这些轨迹栏对于实时视频源来说效果不是很好。有很多冻结问题。你必须有一个超低的帧率(如果你真的想显示它,我可以使用 cv2.waitKey(500)
)。这主要是由于 trackbars 吸吮,而不是阈值操作,后者并不那么慢。
您需要在创建命名 window 之后 添加您的轨迹栏 。然后,对于你的 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 上获取它。有一个例子;尝试 运行 它,然后根据需要进行修改。它会让你改变每个不同颜色空间内的颜色空间和阈值,它会打印你结束的最终阈值。此外,它还将 return 操作的输出图像供您使用。希望它对你有用!欢迎通过 GitHub 为项目发送任何问题或建议。
这是一个例子运行:
作为输出,它为您提供:
Colorspace: HSV
Lower bound: [68.4, 0.0, 0.0]
Upper bound: [180.0, 255.0, 255.0]
以及二进制图像。我目前也在努力将其纳入 Web 应用程序,但这可能要过几天才能完成。
使用此代码查找实时视频的遮蔽范围!这可能会节省您的时间。下面是一个完整的代码,检查它并运行进行测试。
import cv2
import numpy as np
camera = cv2.VideoCapture(0)
def nothing(x):
pass
cv2.namedWindow('marking')
cv2.createTrackbar('H Lower','marking',0,179,nothing)
cv2.createTrackbar('H Higher','marking',179,179,nothing)
cv2.createTrackbar('S Lower','marking',0,255,nothing)
cv2.createTrackbar('S Higher','marking',255,255,nothing)
cv2.createTrackbar('V Lower','marking',0,255,nothing)
cv2.createTrackbar('V Higher','marking',255,255,nothing)
while(1):
_,img = camera.read()
img = cv2.flip(img,1)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
hL = cv2.getTrackbarPos('H Lower','marking')
hH = cv2.getTrackbarPos('H Higher','marking')
sL = cv2.getTrackbarPos('S Lower','marking')
sH = cv2.getTrackbarPos('S Higher','marking')
vL = cv2.getTrackbarPos('V Lower','marking')
vH = cv2.getTrackbarPos('V Higher','marking')
LowerRegion = np.array([hL,sL,vL],np.uint8)
upperRegion = np.array([hH,sH,vH],np.uint8)
redObject = cv2.inRange(hsv,LowerRegion,upperRegion)
kernal = np.ones((1,1),"uint8")
red = cv2.morphologyEx(redObject,cv2.MORPH_OPEN,kernal)
red = cv2.dilate(red,kernal,iterations=1)
res1=cv2.bitwise_and(img, img, mask = red)
cv2.imshow("Masking ",res1)
if cv2.waitKey(10) & 0xFF == ord('q'):
camera.release()
cv2.destroyAllWindows()
break`
谢谢!
拥抱..
我想使用 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 中是否有更好的代码来查找 LASER 的 HSV 值。 谢谢,感谢您的帮助。
您可以使用 cv2.getTrackbarPos()
获取轨迹栏值。另请注意,有时它会使轨迹栏乱序,这很烦人,但至少它们被标记了。
但是,我认为这些轨迹栏对于实时视频源来说效果不是很好。有很多冻结问题。你必须有一个超低的帧率(如果你真的想显示它,我可以使用 cv2.waitKey(500)
)。这主要是由于 trackbars 吸吮,而不是阈值操作,后者并不那么慢。
您需要在创建命名 window 之后 添加您的轨迹栏 。然后,对于你的 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 上获取它。有一个例子;尝试 运行 它,然后根据需要进行修改。它会让你改变每个不同颜色空间内的颜色空间和阈值,它会打印你结束的最终阈值。此外,它还将 return 操作的输出图像供您使用。希望它对你有用!欢迎通过 GitHub 为项目发送任何问题或建议。
这是一个例子运行:
作为输出,它为您提供:
Colorspace: HSV
Lower bound: [68.4, 0.0, 0.0]
Upper bound: [180.0, 255.0, 255.0]
以及二进制图像。我目前也在努力将其纳入 Web 应用程序,但这可能要过几天才能完成。
使用此代码查找实时视频的遮蔽范围!这可能会节省您的时间。下面是一个完整的代码,检查它并运行进行测试。
import cv2
import numpy as np
camera = cv2.VideoCapture(0)
def nothing(x):
pass
cv2.namedWindow('marking')
cv2.createTrackbar('H Lower','marking',0,179,nothing)
cv2.createTrackbar('H Higher','marking',179,179,nothing)
cv2.createTrackbar('S Lower','marking',0,255,nothing)
cv2.createTrackbar('S Higher','marking',255,255,nothing)
cv2.createTrackbar('V Lower','marking',0,255,nothing)
cv2.createTrackbar('V Higher','marking',255,255,nothing)
while(1):
_,img = camera.read()
img = cv2.flip(img,1)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
hL = cv2.getTrackbarPos('H Lower','marking')
hH = cv2.getTrackbarPos('H Higher','marking')
sL = cv2.getTrackbarPos('S Lower','marking')
sH = cv2.getTrackbarPos('S Higher','marking')
vL = cv2.getTrackbarPos('V Lower','marking')
vH = cv2.getTrackbarPos('V Higher','marking')
LowerRegion = np.array([hL,sL,vL],np.uint8)
upperRegion = np.array([hH,sH,vH],np.uint8)
redObject = cv2.inRange(hsv,LowerRegion,upperRegion)
kernal = np.ones((1,1),"uint8")
red = cv2.morphologyEx(redObject,cv2.MORPH_OPEN,kernal)
red = cv2.dilate(red,kernal,iterations=1)
res1=cv2.bitwise_and(img, img, mask = red)
cv2.imshow("Masking ",res1)
if cv2.waitKey(10) & 0xFF == ord('q'):
camera.release()
cv2.destroyAllWindows()
break`
谢谢! 拥抱..