首先,我已经讲过了cv2库的安装了,以及拓展的相关文件了
接下来咱们就开干吧~
#导入cv2模块
import cv2 as cv
def face_detect_demo(img):
gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
face_detect=cv.CascadeClassifier("D:\BaiduNetdiskDownload\OPENCV(WIN)\opencv\sources\data\haarcascades\haarcascade_frontalface_default.xml")
face=face_detect.detectMultiScale(gray)#限制,最小是100×100,最大是1000×1000
for x,y,w,h in face:
cv.rectangle(img,(x,y),(x+w,y+h),color=(0,0,255),thickness=2)
cv.imshow("result",img)
#读取摄像头
cap=cv.VideoCapture(0)
#循环
while True:
flag,frame=cap.read()
if not flag:
break
face_detect_demo(frame)
if ord('q')==cv.waitKey(1):
break
#释放内存
cv.destroyAllWindows(0)
#释放摄像头
cap.release()
''''#灰度转换
gray_img=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
#显示灰度
cv.imshow("gray",gray_img)
#显示照片
cv.imshow("read_img",img)
#保存灰度照片
cv.imwrite("gray_face11.jpg",gray_img)
#等待
cv.waitKey(0)
#释放内存
cv.destroyAllWindows()
'''
这是整体的代码
下面咱们细细道来:
对其中的函数属性做个解释:
创建一个VideoCapture对象,它的参数可以是设备索引或视频文件的名称。
有时候cap可能尚未初始化捕获,通过 cap.isOpened() 方法检查它是否已初始化。如果是True,那么确定。否则使用cap.open()打开它
cap.read() 返回布尔值(True/ False)。如果正确读取该帧,它将为True
cv2.imshow之后要跟cv2.waitkey,他们是一对好兄弟
先解释下字面意思:
cv2.waitKey(1000)
:在1000ms内根据键盘输入返回一个值0xFF
:一个十六进制数ord('q')
:返回q的ascii码0xFF
是一个十六进制数,转换为二进制是11111111。waitKey返回值的范围为(0-255),刚好也是8个二进制位。那么我们将 cv2.waitKey(1) & 0xFF
计算一下(不知怎么计算的可以百度位与运算)发现结果仍然是waitKey的返回值,那为何要多次一举呢?直接 cv2.waitKey(1) == ord('q')
不就好了吗。
实际上在linux上使用waitkey有时会出现waitkey返回值超过了(0-255)的范围的现象。通过cv2.waitKey(1) & 0xFF
运算,当waitkey返回值正常时 cv2.waitKey(1)
= cv2.waitKey(1000) & 0xFF
,当返回值不正常时,cv2.waitKey(1000) & 0xFF
的范围仍不超过(0-255),就避免了一些奇奇怪怪的BUG。
import cv2
#摄像头
cap=cv2.VideoCapture(0)
flag=1
num=1
while(cap.isOpened()):#检测是否在开启状态
ret_flag,Vshow=cap.read()#得到每帧图像
cv2.imshow("Capture_Test",Vshow)#显示图像
k=cv2.waitKey(1) &0xFF #按键判断
if k==ord('s'):#保存
cv2.imwrite(r"C:\Users\lenovo\Desktop\output/"+str(num)+".name"+".jpg",Vshow) #路径前面必须加一个r,否则会报错
print("sucess to save",str(num)+".jpg")
print("-----------")
num+=1
elif k==ord(' '):
break
cap.release()
cv2.destroyAllWindows()
功能是从摄像头截取照片并进行保存到指定目录下,注意在路径前面要加一个r,要不然解析不出来路径,会报错