python - opencv如何在屏幕录像机上使用级联
问题描述
所以我是opencv的新手,在练习了一些面部检测器并了解了如何使用该库之后,我创建了自己的级联,它应该可以识别我电脑上的图标,例如徽标和其他图标。首先要确保我的级联工作我写了一个检测我拍摄的图像中的图标,我截取了一个屏幕截图并通过级联处理它作为图像并且工作正常。代码是
import numpy as np
import cv2
img = cv2.imread('body.jpg')
face_csc = cv2.CascadeClassifier('new_cascade.xml')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_csc.detectMultiScale(gray, 1.1 , 4)
for (x,y,w,h) in faces:
cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),3)
cv2.imshow('img',img)
cv2.waitKey(0)
一段时间后,我写了这个来渲染我的屏幕,同时检测图标的方式与我在屏幕截图上尝试的方式相同:
import numpy as np
import cv2
from PIL import ImageGrab
fourcc = cv2.VideoWriter_fourcc(*'XVID')
face_csc = cv2.CascadeClassifier('new_cascade.xml')
out = cv2.VideoWriter("test_output.avi", fourcc, 5.0, (1366, 768))
while True:
img = ImageGrab.grab(bbox=(100, 10, 750, 750))
# convert image to numpy array
img_np = np.array(img)
# convert color space from BGR to RGB
frame = cv2.cvtColor(img_np, cv2.COLOR_BGR2RGB)
# show image on OpenCV frame
faces = face_csc.detectMultiScale(frame, 1.1 , 4)
cv2.imshow("stream", frame)
# write frame to video writer
out.write(frame)
for (x,y,w,h) in faces:
cv2.rectangle(frame,(x,y),(x+w,y+h), (255,0,0), 2)
roi_gray = frame[y:y+h, x:x+w]
roi_color = img_np[y:y+h,x:x+w]
if cv2.waitKey(1) == 27:
break
cv2.waitKey(0)
out.release()
但是在运行代码时它没有显示任何错误,但它也没有检测或识别它只是记录我的屏幕的任何图标,我已经尝试调试了几个小时,但无济于事,有什么想法吗?
解决方案
您应该在绘制矩形之后显示和编写视频,而不是之前。
import numpy as np
import cv2
from PIL import ImageGrab
fourcc = cv2.VideoWriter_fourcc(*'XVID')
face_csc = cv2.CascadeClassifier('new_cascade.xml')
out = cv2.VideoWriter("test_output.avi", fourcc, 5.0, (1366, 768))
while True:
img = ImageGrab.grab(bbox=(100, 10, 750, 750))
# convert image to numpy array
img_np = np.array(img)
# convert color space from BGR to RGB
frame = cv2.cvtColor(img_np, cv2.COLOR_BGR2RGB)
# show image on OpenCV frame
faces = face_csc.detectMultiScale(frame, 1.1 , 4)
for (x,y,w,h) in faces:
cv2.rectangle(frame,(x,y),(x+w,y+h), (255,0,0), 2)
roi_gray = frame[y:y+h, x:x+w]
roi_color = img_np[y:y+h,x:x+w]
if cv2.waitKey(1) == 27:
break
cv2.imshow("stream", frame)
# write frame to video writer
out.write(frame)
cv2.waitKey(0)
out.release()
推荐阅读
- c++ - 构建多个文件时出现编译错误
- javascript - node.js 中来自数据库的异步请求
- html - 我想在透明导航栏后面放置图像?
- javascript - 如何在下拉列表中添加“全部”选项?
- java - 为什么 java int 类型的有效值在 -2,147,483,648 到 2,147,483,647 范围内?
- solr - Solr 有时无法解析查询,就好像它没有完全收到它一样
- html - 为什么页面底部没有裁剪我的绝对定位元素
- flutter - 颤动图像动画越来越小
- mysql - 如何每月显示零值的数据
- regex - 如何重写此正则表达式以验证 dd-mm-yyyy 格式的日期