颜色匹配
自己也是第一次学习这个小小的项目,查过一些资料后,自己总结了出来,应该比较完善。主要思路就是通过将图像转化为HSV模式(hub,saturation,value),再配合TrackBar调节参数,找到目标颜色。
TrackBar使用
TrackBar在opencv中,主要有三个函数 cv2.createTrackbar,cv2.getTrackbarPos(), cv2.setTrackbarPos(这个函数使用较少,因为第一个函数就可以实现他的功能)
cv2.createTrackbar
createTrackbar(trackbarName, windowName,value, count, onChange)
- 第一个参数时滑动条的名字
- 第二个参数是滑动条被放置的窗口的名字
- 第三个参数是滑动条默认值
- 第四个参数时滑动条的最大值
- 第五个参数时回调函数,每次滑动都会调用回调函数
cv2.getTrackbarPos()
getTrackbarPos(trackbarname,winname)
- 第一个参数是滑动条名字
- 第二个时所在窗口
- 返回值是滑动条的数值
cv2.setTrackbarPos
该函数作用就是设置滑动条的默认值,掌握第一个函数即可,这里不过多介绍
具体操作
cv2.namedWindow("TrackBars")
cv2.resizeWindow("TrackBars", 640, 340)
cv2.createTrackbar("Hue Min", "TrackBars", 0, 179, empty)
cv2.createTrackbar("Hue Max", "TrackBars", 63, 179, empty)
cv2.createTrackbar("Sat Min", "TrackBars", 64, 255, empty)
cv2.createTrackbar("Sat Max", "TrackBars", 144, 255, empty)
cv2.createTrackbar("Val Min", "TrackBars", 87, 255, empty)
cv2.createTrackbar("Val Max", "TrackBars", 255, 255, empty)
首先,要自己定义一个给予Trackbar的窗口,这里用到了cv2.namedWindow(),以及cv2.resizeWindow() 这里的默认值参数是通过自己调试的橙色值,这个值需要自调试寻找, 该值仅供参考。
imgHSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
h_min = cv2.getTrackbarPos("Hue Min", "TrackBars")
h_max = cv2.getTrackbarPos("Hue Max", "TrackBars")
s_min = cv2.getTrackbarPos("Sat Min", "TrackBars")
s_max = cv2.getTrackbarPos("Sat Max", "TrackBars")
v_min = cv2.getTrackbarPos("Val Min", "TrackBars")
v_max = cv2.getTrackbarPos("Val Max", "TrackBars")
print(h_min, h_max, s_min, s_max, v_min, v_max)
lower = np.array([h_min, s_min, v_min])
upper = np.array([h_max, s_max, v_max])
mask = cv2.inRange(imgHSV, lower, upper)
imgResult = cv2.bitwise_and(img, img, mask=mask)
接着,再将需要调用的图像转化为HSV模式,这里有个cv2.inRange()函数,cv2.bitwise_and()函数,两个配合使用
cv2.inRange()
这里拿该函数做一个掩膜
- 第一个参数是要掩膜的图像
- 第二,第三个参数是两个阈值
低于lower或者高于upper全都设置为0(黑色),在这之间为255(白色)
cv2.bitwise_and()
这里只介绍其配合上个函数用法,另一种用法有兴趣的可以自己查询
- 第一个,第二个参数为掩膜图像,一般在原始图片进行
- 第三个参数就是掩膜的阈值,上个函数已经设置好了
效果图最后展示,这里简单描述大概什么效果:在阈值内的即inRange函数的白色白色区域,他会展现原始图像中这个区域的图像,黑色区域,就显示黑色
总代码
import cv2
import numpy as np
def empty(a):
pass
def stackImages(scale,imgArray):
rows = len(imgArray)
cols = len(imgArray[0])
rowsAvailable = isinstance(imgArray[0], list)
width = imgArray[0][0].shape[1]
height = imgArray[0][0].shape[0]
if rowsAvailable:
for x in range(0, rows):
for y in range(0, cols):
if imgArray[x][y].shape[:2] == imgArray[0][0].shape[:2]:
imgArray[x][y] = cv2.resize(imgArray[x][y], (0, 0), None, scale, scale)
else:
imgArray[x][y] = cv2.resize(imgArray[x][y], (imgArray[0][0].shape[1], imgArray[0][0].shape[0]), None, scale, scale)
if len(imgArray[x][y].shape) == 2: imgArray[x][y]= cv2.cvtColor(imgArray[x][y], cv2.COLOR_GRAY2BGR)
imageBlank = np.zeros((height, width, 3), np.uint8)
hor = [imageBlank]*rows
hor_con = [imageBlank]*rows
for x in range(0, rows):
hor[x] = np.hstack(imgArray[x])
ver = np.vstack(hor)
else:
for x in range(0, rows):
if imgArray[x].shape[:2] == imgArray[0].shape[:2]:
imgArray[x] = cv2.resize(imgArray[x], (0, 0), None, scale, scale)
else:
imgArray[x] = cv2.resize(imgArray[x], (imgArray[0].shape[1], imgArray[0].shape[0]), None,scale, scale)
if len(imgArray[x].shape) == 2: imgArray[x] = cv2.cvtColor(imgArray[x], cv2.COLOR_GRAY2BGR)
hor= np.hstack(imgArray)
ver = hor
return ver
cap = cv2.VideoCapture(0)
cap.set(3, 640)
cap.set(4, 400)
cv2.namedWindow("TrackBars")
cv2.resizeWindow("TrackBars", 640, 340)
cv2.createTrackbar("Hue Min", "TrackBars", 0, 179, empty)
cv2.createTrackbar("Hue Max", "TrackBars", 63, 179, empty)
cv2.createTrackbar("Sat Min", "TrackBars", 64, 255, empty)
cv2.createTrackbar("Sat Max", "TrackBars", 144, 255, empty)
cv2.createTrackbar("Val Min", "TrackBars", 87, 255, empty)
cv2.createTrackbar("Val Max", "TrackBars", 255, 255, empty)
while True:
success, img = cap.read()
imgHSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
h_min = cv2.getTrackbarPos("Hue Min", "TrackBars")
h_max = cv2.getTrackbarPos("Hue Max", "TrackBars")
s_min = cv2.getTrackbarPos("Sat Min", "TrackBars")
s_max = cv2.getTrackbarPos("Sat Max", "TrackBars")
v_min = cv2.getTrackbarPos("Val Min", "TrackBars")
v_max = cv2.getTrackbarPos("Val Max", "TrackBars")
print(h_min, h_max, s_min, s_max, v_min, v_max)
lower = np.array([h_min, s_min, v_min])
upper = np.array([h_max, s_max, v_max])
mask = cv2.inRange(imgHSV, lower, upper)
imgResult = cv2.bitwise_and(img, img, mask=mask)
imgStack = stackImages(0.5, ([img, imgHSV], [mask, imgResult]))
cv2.imshow("Stacked Images", imgStack)
cv2.waitKey(1)
pass
cv2.release()
cv2.destroyWindow()
这里有一个stackImages()函数,图片的堆栈,反响大的话,单独做一个详细的讲解,这里简单说一下参数,0.5就是每个图像展示的比例,([img, imgHSV], [mask, imgResult])就是两行两列展示这些图像,展示一下效果图(这里截取的橙色)
还有什么不懂的地方可以下方留言或者私信!
Want to make every ordinary day overflow joy!
|