为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

料青山看我应如是 2023-03-08 10:28:29
见下文,以改进对我的问题的解释我在我的 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(),第一行这导致我收到上述错误消息。是否必须关闭摄像头端口才能再次使用?
查看完整描述

1 回答

?
慕村225694

TA贡献1880条经验 获得超4个赞

我不知道你到底想做什么,但你的错误是你使用了 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 = 0


for 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 = 0


for 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像第一个例子一样运行所有的东西。


查看完整回答
反对 回复 2023-03-08
  • 1 回答
  • 0 关注
  • 59 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信