我正在使用 OpenCV 包和face_recognition 包来检测我的笔记本电脑网络摄像头上的人脸。
每当我运行它时,代码都运行良好,但我遇到了相同的 GStreamer 错误。
from imutils.video import VideoStream
import face_recognition
import pickle
import argparse
import time
import cv2
import imutils
ap = argparse.ArgumentParser()
ap.add_argument("-o", "--output", type=str, help="path to output video")
ap.add_argument("-y", "--display", type=int, default=1,
help="0 to prevent display of frames to screen")
ap.add_argument("-d", "--detection", default="hog",
type=str, help="Detection method (hog/cnn")
args = vars(ap.parse_args())
print("[INFO] loading encodings...")
data = pickle.load(open("encodings.p", "rb"))
print("[INFO] starting video stream...")
vs = VideoStream().start()
writer = None
time.sleep(3)
while True:
frame = vs.read()
rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
rgb = imutils.resize(frame, width=750)
r = frame.shape[1] / float(rgb.shape[1])
boxes = face_recognition.face_locations(rgb, model=args["detection"])
encodings = face_recognition.face_encodings(rgb, boxes)
for encoding, locations in zip(encodings, boxes):
matches = face_recognition.compare_faces(data["encodings"], encoding)
name = "Unknown"
names = {}
if True in matches:
ids = [i for (i, b) in enumerate(matches) if b]
for i in ids:
name = data["names"][i]
names[name] = names.get(name, 0) + 1
name = max(names, key=names.get)
for (top, right, bottom, left) in boxes:
top = int(top * r)
right = int(right * r)
bottom = int(bottom * r)
left = int(left * r)
cv2.rectangle(frame, (left, top), (right, bottom), (255, 0, 0), 3)
y = top - 15 if top - 15 > 15 else top + 15
cv2.putText(frame, name, (left, y),
cv2.FONT_HERSHEY_SIMPLEX, 0.75, (255, 0, 0), 2)
if writer is None and args["output"] is not None:
fourcc = cv2.VideoWriter_fourcc(*"MJPG")
writer = cv2.VideoWriter(
args["output"], fourcc, 20, (frame.shape[1], frame.shape[2]), True)
if writer is not None:
writer.write(frame)
if args["display"] == 1:
cv2.imshow("frame", frame)
key = cv2.waitKey(1)
if key == ord("q"):
break
cv2.destroyAllWindows()
vs.stop()
if writer is not None:
writer.release()
我找不到任何问题,但我总是收到此错误:
[ WARN:0] global /home/azazel/opencv/modules/videoio/src/cap_gstreamer.cpp (935) open OpenCV | GStreamer warning: Cannot query video position: status=0, value=-1, duration=-1
相机仍然显示并且面部识别有效,但是错误意味着什么以及如何修复它?
这不是错误,这是正常现象。直播流没有持续时间,因此无法计算其当前位置。此警告对于实时源(例如相机)应该是无害的。
我正在使用 ROS noetic,我遇到了同样的问题。我通过再次安装OpenCV解决了这个问题。
pip install opencv-python
我正在致力于将凸轮数据作为主题发布。
import rospy
from sensor_msgs.msg import Image
from cv_bridge import CvBridge, CvBridgeError
import cv2
cap=cv2.VideoCapture(0)
if not cap.isOpened():
print("cannot open camera ")
bridge= CvBridge()
def talker():
pub=rospy.Publisher('/web_cam',Image, queue_size=1)
rospy.init_node('image',anonymous=True)
rate=rospy.Rate(10)
while not rospy.is_shutdown():
ret,frame = cap.read()
if not ret:
break
msg=bridge.cv2_to_imgmsg(frame,"bgr8")
pub.publish(msg)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
if rospy.is_shutdown():
cap.release()
talker()
我也遇到了同样的警告“GStreamer警告:无法查询视频位置:状态= 0,值= -1,持续时间= -1”。
对于 Linux,可以通过使用“cam = cv.VideoCapture(0, cv.CAP_V4L2)”来解决。