简体   繁体   中英

Opencv Python3 when attempting to switch from saved images to live video feed the program hangs

Hello there people of the internet, The code in question is using python 3.8.5 and opencv 4 (I do not know how to check the exact version but I know its opencv 4). My team and I are attempting to take a live video feed from a usb webcam and determine the distance between the camera and the object in the video feed. We had some success in reading the distance with image stills taken from the same camera and read via the imutils library. But now we want to attempt to calculate that data live.

Our code is below.

from imutils import paths
import numpy as np
import imutils
import cv2
import time
import os

def find_marker(image):
    #conver the image into grayscales, blurs it then detects edges
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    gray = cv2.GaussianBlur(gray, (5, 5), 0)
    edged = cv2.Canny(gray, 35, 125)

    #find the contours in the edged image and keep the largest one;
    #w'll assume that this our piece of paper in the image
    cnts = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
    cnts = imutils.grab_contours(cnts)
    c = max(cnts, key = cv2.contourArea)

    #compute the bounding box of the paper region and return it
    return cv2.minAreaRect(c)

def distance_to_camera(knownWidth, focalLength, perWidth):
    #compute and return the distance from the marker to the camera
    return (knownWidth * focalLength) / perWidth


#intialize the known distances from the camera to the object
KNOWN_DISTANCE = 22

#initialize the known object width, which in this case the piece of paper is 12 inches
KNOWN_WIDTH = 11

#load the first image that contains an object that is known to be 2 feet
#from our camera, the find the paper marker in the image and
#initialize the focal length
rootimage = cv2.imread("/Volumes/404/final_rov_code/Python/images/2ft.jpg")
marker1 = find_marker(rootimage)
marker2 = marker1[0][1] - marker1[1][1]
focalLength = (marker2 * KNOWN_DISTANCE) / KNOWN_WIDTH
print(marker1)
print(marker2)
image = cv2.VideoCapture(0)
        #Loop over the image
while True:
    #load the image, find the marker in the image then compute the
    #distance to the marker from the camera
    frame, ret = image.read()
    marker = find_marker(ret)
    inches = distance_to_camera(KNOWN_WIDTH, focalLength, marker[1][0])
    print(inches)
    #draw a bounding box around the image and display it
    box = cv2.cv.BoxPoints(marker) if imutils.is_cv2() else cv2.boxPoints(marker)
    box = np.int0(box)
    cv2.drawContours(frame, [box], -1, (0, 255, 0), 2)
    cv2.putText(ret, "%.2fin" % inches,
        (ret.shape[1] - 200, ret.shape[0] - 20), cv2.FONT_HERSHEY_SIMPLEX,
        2.0, (0, 255, 0), 3)
    cv2.imshow("image", ret)
    # if cv2.waitKey(33) == ord('q'):
    #     os.system('pause')

I understand that it should be as minimalistic as possible but since we have no idea what could be causing the program to hang upon reading the first frame of the video feed. Could it be the fact that the processing is taking too many resources from the single thread? (We're all newbies to the advanced sides of opencv and python 3) There is no other errors that we are aware of at the moment so no leads in the terminal of where it could be coming from.

Thank you in advance.

Your problem is likely a result of not including the waitkey() statement at the end of your while loop. It takes time for openCV to load the image, so if the program doesn't pause for long enough for the image to be drawn, the display just doesn't update. Check out this other StackOverflow question for more details.

In addition, you have your ret and frame variables mixed up. ret should be the first one and frame should be the second. Right now, the drawContours() method isn't going to do anything because you're passing it a boolean instead of an image.

Making those changes fixed this for me using Python 3.9 and OpenCV 4.5.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM