pi camera: 相机已经在使用端口 0

见下文,以改进对我的问题的解释


我在我的 Raspberry Pi 上使用 OpenCV 4.1.2 编写了一个简单的线跟随器。一切正常,但现在我想调用一个也使用 camera.capture_continous 函数的函数。当我调用该函数时(它应该顺便检测相机框架中的圆圈)它只拍摄一张照片,检测到一些圆圈然后冻结并且不拍摄任何其他照片。这是我的源代码的一部分:



rawCapture = PiRGBArray(camera, size=(320, 180))

rawCaptureCircles = PiRGBArray(camera, size=(320, 180))



for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):  

    counter = counter + 1


    image = frame.array

    line = cv2.inRange(image, (0, 0, 0), (255, 255, 75)) 


    if counter > 10: #call function

        function()


    rawCapture.truncate(0)


和功能:


for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):  

        imageCirles = frame.array

        gray = cv2.cvtColor(imageCirles, cv2.COLOR_BGR2GRAY)


        # detect circles in the image

        circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 2, 400)


        # ensure at least some circles were found

        if circles is not None:


            # convert the (x, y) coordinates and radius of the circles to integers

            circles = np.round(circles[0, :]).astype("int")


            # loop over the (x, y) coordinates and radius of the circles

            for (x, y, r) in circles:

                # draw the circle in the output image, then draw a rectangle

                cv2.circle(imageCirles, (x, y), r, (255, 255, 0), 4)

                cv2.rectangle(imageCirles, (x - 5, y - 5), (x + 5, y + 5), (0, 0, 255), -1)


                cv2.putText(imageCirles, str(((x - 160) / 10) - 24), (100, 100), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 0), 2)

我希望现在一切都或多或少地清楚了。


编辑:


希望对我的问题有更好的解释:


我很绝望!我已经尝试了(至少在我看来)所有可能的方法,但该功能仍然不起作用。但是,如果我将函数的源代码放入一个单独的 python 文件中并执行它,一切正常!我知道理论上的错误是什么,但我真的不知道如何修复它。这是问题的另一种解释:


名为 function() 的函数基本上可以正常工作(如果我将它放入一个空的 python 中并执行它),但每次在我的正常程序中执行 function() 时,我都会收到以下错误消息 The camera is already using port 0.这是因为在程序的正常循环中


for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True)


用于创建无限循环但是如果现在调用 function(),第一行


这导致我收到上述错误消息。是否必须关闭摄像头端口才能再次使用?




料青山看我应如是
浏览 60回答 1
1回答

慕村225694

我不知道你到底想做什么,但你的错误是你使用了 second capture_continuous。您应该只使用一个capture_continuous并发送frame(甚至image)作为参数,function(frame)并且它应该只使用 this frame。在处理完这个单帧后,它将返回到主循环,主循环将function(frame)再次运行 next frame- 所以它会像在capture_continuous# --- functions ---def function(frame):        imageCirles = frame.array    gray = cv2.cvtColor(imageCirles, cv2.COLOR_BGR2GRAY)    # detect circles in the image    circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 2, 400)    # ensure at least some circles were found    if circles is not None:        # convert the (x, y) coordinates and radius of the circles to integers        circles = np.round(circles[0, :]).astype("int")        # loop over the (x, y) coordinates and radius of the circles        for (x, y, r) in circles:            # draw the circle in the output image, then draw a rectangle            cv2.circle(imageCirles, (x, y), r, (255, 255, 0), 4)            cv2.rectangle(imageCirles, (x - 5, y - 5), (x + 5, y + 5), (0, 0, 255), -1)            cv2.putText(imageCirles, str(((x - 160) / 10) - 24), (100, 100), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 0), 2)# --- main ---rawCapture = PiRGBArray(camera, size=(320, 180))counter = 0for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):      counter += 1    image = frame.array    line = cv2.inRange(image, (0, 0, 0), (255, 255, 75))     if counter > 10: #call function        function(frame)            rawCapture.truncate(0)编辑:最终你可以使用break退出一个循环然后运行另一个循环。counter = 0for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):      counter += 1    image = frame.array    line = cv2.inRange(image, (0, 0, 0), (255, 255, 75))     if counter > 10: #call function        break            rawCapture.truncate(0)    for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):      function(frame)            rawCapture.truncate(0)我不确定,但它可能会造成很小的延迟。如果第一个循环用于跟随线,那么它将不再跟随。现在它将只检查圆圈。如果你想同时跟随线和检查圆圈,那么你应该capture_continuous像第一个例子一样运行所有的东西。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python