opencv-python-学习笔记八(颜色空间转化和目标跟踪)
1.颜色空间转换
OpenCV中有150多种颜色空间转换方法。但是我们将研究只有两个最广泛使用的,BGR↔Gray 和BGR↔HSV,BGR和灰度图的转换使用 cv2.COLOR_BGR2GRAY ,
BGR和HSV的转换使用 cv2.COLOR_BGR2HSV。在HSV空间中,H表示色彩/色度,取值范围 [0,179],S表示饱和度,取值范围 [0,255],V表示亮度,取值范围 [0,255]。但是不同的软件使用值不同
dst = cv.cvtColor( src, code[, dst[, dstCn]] )
参数:
src:输入图像:8位无符号,16位无符号(CV_16UC…),或单精度浮点。
code:转换方式
dst:与原图像深度大小相同的输出图像。可省略
dstCn:标图像通道数,默认为0,表示由src和code决定。
打印所有的code:
import cv2 as cv flags = [i for i in dir(cv) if i.startswith('COLOR_')] print(flags)
函数说明:
该函数将输入图像从一个颜色空间转换为另一个颜色空间。
举例
import matplotlib.pyplot as plt import cv2 img_BGR = cv2.imread('2.jpg') # BGR plt.subplot(331), plt.imshow(img_BGR), plt.axis('off'), plt.title('BGR') img_RGB = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2RGB) plt.subplot(332), plt.imshow(img_RGB), plt.axis('off'), plt.title('RGB') img_GRAY = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2GRAY) plt.subplot(333), plt.imshow(img_GRAY), plt.axis('off'), plt.title('GRAY') img_HSV = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2HSV) plt.subplot(334), plt.imshow(img_HSV), plt.axis('off'), plt.title('HSV') img_YcrCb = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2YCrCb) plt.subplot(335), plt.imshow(img_YcrCb), plt.axis('off'), plt.title('YcrCb') img_HLS = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2HLS) plt.subplot(336), plt.imshow(img_HLS), plt.axis('off'), plt.title('HLS') img_XYZ = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2XYZ) plt.subplot(337), plt.imshow(img_XYZ), plt.axis('off'), plt.title('XYZ') img_LAB = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2LAB) plt.subplot(338), plt.imshow(img_LAB), plt.axis('off'), plt.title('LAB') img_YUV = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2YUV) plt.subplot(339), plt.imshow(img_YUV), plt.axis('off'), plt.title('YUV') plt.show() cv2.imshow('gray', img_GRAY) k = cv2.waitKey(0) # 始终检测键盘 if k == 27: # 按ESC退出 cv2.destroyAllWindows()
2.目标跟踪
现在我们知道了如何将BGR图像转换为HSV,我们可以使用它来提取一个彩色对象。HSV的彩色空间比BGR的空间更容易表示一个颜色。在以下案例中,我们尝试提取一个蓝色对象。
2.1提取流程
- 提取取视频的每一帧
- 从BGR转换到HSV颜色空间
- 我们对HSV图像设置一个蓝色范围的阈值
- 提取
3.如何查找BGR值的HSV,同时设定目标跟踪中的阈值
查找BGR的HSV值
方法一:
import cv2 as cv import numpy as np # 同样可以使用函数cv.cvtColor()。此时只需传递所需的BGR值,而不是传递图像。例如,要查找绿色的HSV值,怎运行以下程序 green = np.uint8([[[0, 255, 0]]]) hsv_green = cv.cvtColor(green, cv.COLOR_BGR2HSV) print(hsv_green) # [[[60 255 255]]]
方法二:
设定阈值
上述所得结果[H- 10,100,100]和[H+ 10,255, 255]分别作为下界和上界。方法一种所得的 H 即为60.