OpenCV是一个开源的计算机视觉库,可以用于实现各种视觉任务,例如图像处理、物体识别、目标跟踪、人脸检测等。OpenCV具有丰富的图像处理和计算机视觉算法,例如边缘检测、滤波、形态学处理、特征提取和匹配等,可以帮助开发人员实现各种视觉任务,同时具有高效性、灵活性和易用性等优点。在本文中,我们将主要采取OpenCV读取数据及识别出人的手势。
首先,OpenCV 中可以使用imread函数将图像转换为向量,其用法如下:
# 读取图像 img = cv2.imread('image.jpg') # 将图像转换为一维向量 vector = img.reshape((-1,)) |
在上述代码中,reshape 函数中的参数 (-1,) 表示将图像转换为一个一维行向量。变量 vector 即为转换后的向量。
其次,使用OpenCV创建手部直方图可以帮助我们将手势与背景进行分离。具体步骤如下:
1.读取视频或图像并将其转换为HSV格式。 2.创建一个与直方图相对应的掩膜。这可以通过使用cv2.inRange()函数创建一个二进制掩膜来实现。我们可以根据颜色阈值来筛选手的部分,以便后续操作。 3.计算手部直方图。这可以使用cv2.calcHist()函数来实现。我们可以在H通道上计算手的颜色直方图。 4.标准化直方图。我们可以使用cv2.normalize()函数来实现。这将确保直方图的值处于0到255之间。 5.应用掩膜。我们可以使用cv2.bitwise_and()函数将掩膜应用到原始图像上,以便只显示手的部分。 |
代码如下:
def build_squares(img): p,q,r,s = 420, 140, 10, 10 d = 10 imgCrop = None .... return crop def get_hand_hist(): cam = cv2.VideoCapture(1) if cam.read()[0]==False: cam = cv2.VideoCapture(0) p,q,r,s = 300, 100, 300, 300 flagPressedC, flagPressedS = False, False imgCrop = None while True: img = cam.read()[1] img = cv2.flip(img, 1) img = cv2.resize(img, (640, 480)) hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) ..... with open("hist", "wb") as f: pickle.dump(hist, f) |
在上述代码中,build_squares()函数创建一个包含50个正方形的矩阵,每个正方形的大小为10x10像素。该函数还通过计算这些正方形的直方图来帮助将手势从背景中分离出来。具体来说,它遍历了这些正方形并将它们的像素存储在一个数组中,最终将这些数组连接起来形成一个完整的手势图像。get_hand_hist()函数使用摄像头捕捉图像,并根据用户的输入,生成手势直方图。在该函数中,用户首先需要将手放在一个300x300像素的框中,然后按下键盘上的“c”键以获取手势直方图。此后,程序将计算直方图并归一化。如果用户按下键盘上的“s”键,程序将退出循环并保存直方图。如果用户没有按下“s”键,程序将继续在图像中显示手势矩阵和手势直方图。程序还使用cv2.calcBackProject()函数将直方图投影到新图像中,并使用一些形态学转换和滤波操作来优化图像的质量。最后,它使用pickle库将直方图保存到名为“hist”的文件中。
标签:函数,img,cv2,技术,Opencv,直方图,应用,图像,手势 From: https://www.cnblogs.com/haosenstudio/p/17372412.html