毕设需要做图片识别,不想用已经有的数据集,所以写了一个基于opencv通过笔记本摄像头采集指定数量的py文件,下面的常量可以根据需要更改,别的不说直接上代码 中间注释掉的部分是对图像做的一些处理,如果用不上可以删除,备注写的比较简单,不好意思
# -*- coding:utf-8-*-
import cv2
import os
import time
import numpy as np
width = 200
height = 200 # 图片大小
numofsamples = 300 # 每个手势录制的样本数
counter = 0 # 计数器,记录已经录制多少图片了
path = ".\\data\\"
cap = cv2.VideoCapture(0) # 创建一个视频捕捉对象 # 0为(笔记本)内置摄像头
gesturename = (input("enter the gesture folder name: "))
while(True): # 读帧
ret, frame = cap.read()
res = cv2.resize(frame,(200,200),interpolation=cv2.INTER_CUBIC)
print(res.shape)
# #转换为灰度图
gray = cv2.cvtColor(res,cv2.COLOR_BGR2GRAY)
#
# gradX = cv2.Sobel(gray, ddepth=cv2.CV_32F, dx=1, dy=0, ksize=-1)
# gradY = cv2.Sobel(gray, ddepth=cv2.CV_32F, dx=0, dy=1, ksize=-1)
#
# gradient = cv2.subtract(gradX, gradY)
# gradient = cv2.convertScaleAbs(gradient)
# # 去除图像上的噪声
# blurred = cv2.blur(gradient, (9, 9))
# (_, thresh) = cv2.threshold(blurred, 90, 255, cv2.THRESH_BINARY)
# # 填充空白区域
# kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (25,25))
# closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
# #执行4次形态学腐蚀
# closed = cv2.erode(closed, None, iterations=4)
# closed = cv2.dilate(closed, None, iterations=4)
# # 找轮廓
# (image,cnts, _,) = cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# c = sorted(cnts, key=cv2.contourArea,reverse=True)[0]
#
# rect = cv2.minAreaRect(c)
# box = np.int0(cv2.boxPoints(rect))
# cv2.drawContours(res, [box], -1, (0, 255, 0), 3)
#裁剪
# Xs = [i[0] for i in box]
# Ys = [i[1] for i in box]
# x1 = min(Xs)
# x2 = max(Xs)
# y1 = min(Ys)
# y2 = max(Ys)
# height = y2 - y1
# width = x2 -x1
# cropImg = image[y1:y1+height, x1: x1+width]
if not os.path.exists(path +'\\'+gesturename):
os.makedirs(path +'\\'+gesturename)
if counter<numofsamples:
counter += 1
name = gesturename + str(counter) # 给录制的手势命名
print("Saving img: ", name)
cv2.imshow('picture', res)
cv2.imwrite(path +'\\\\'+gesturename+ '\\\\'+name + '.png', res) # 写入文件
time.sleep(0.05)
# cv2.imwrite('1.jpg', gray)
else:
print('已经获取'+str(numofsamples)+'张图片')
break
#PATH1 = path +'\\\\'+gesturename
cap.release()
cv2.destroyAllWindows()