Kai Strachan
Kai Strachan

Reputation: 151

GStreamer warning: Cannot query video position: status=0, value=-1, duration=-1

I am using the OpenCV package with the face_recognition package to detect faces on my laptop webcam.

Whenever I run it, the code runs fine but I run into the same GStreamer error.

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()

I can't find any problems, yet I always get this error:

[ 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

The camera still displays and the facial recog works but what does the error signify and how can I fix it?

Upvotes: 13

Views: 38511

Answers (3)

Shivam Patel
Shivam Patel

Reputation: 21

I also came around this same warning:

GStreamer warning: Cannot query video position: status=0, value=-1, duration=-1" .

This can be solved by using the following for Linux:

cam = cv.VideoCapture(0, cv.CAP_V4L2)

Upvotes: 2

SeB
SeB

Reputation: 1626

This is not a bug, it is normal. A live stream has no duration, so its current position cannot be computed. This warning should be harmless for a live source such as a camera.

Upvotes: 6

Mubashir
Mubashir

Reputation: 145

I am using ROS noetic I came across the same problem. I solved it by installing OpenCV again.

pip install opencv-python 

I was working on publishing cam data as a topic.

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()

Upvotes: 0

Related Questions