OpenCV和Python - 实时图像(帧)处理

3
我们正在学校做一个项目,需要进行基本的图像处理。我们的目标是使用Raspberry Pi的每一帧视频并进行实时图像处理。
我们尝试在Python程序中包含raspistill,但到目前为止还没有成功。我们项目的目标是设计一辆遵循蓝色/红色/任何颜色线路的RC车,并借助图像处理实现。
我们认为制作一个完成所有必要图像处理的Python程序是个好主意,但我们目前遇到了将录制的图像导入Python程序的困难。是否有用picamera实现这一点的方法,或者我们应该尝试其他方法?
对于任何好奇的人,这是我们当前程序的样子。
while True:
    #camera = picamera.PiCamera()
    #camera.capture('image1.jpg')
    img = cv2.imread('image1.jpg')
    width = img.shape[1]
    height = img.shape[0]
    height=height-1
    for x in range (0,width):
            if x>=0 and x<(width//2):
                    blue  = img.item(height,x,0)
                    green = img.item(height,x,1)
                    red   = img.item(height,x,2)
                    if red>green and red>blue:

相同的问题,除了着色。https://dev59.com/8oPba4cB1Zd3GeqPzO-A - emrhzc
看起来你需要的一切(在被接受的答案中提到的)都可以在OpenCV的官方教程中找到?-- OpenCV:视频入门 除非你无法实时处理,否则请参考OpenCV-Python:如何从实时视频流中获取最新帧或跳过旧帧 - Stack Overflow - user202729
2个回答

9

OpenCV已经包含了处理实时摄像头数据的功能。

这份OpenCV文档提供了一个简单的例子:

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()

    # Our operations on the frame come here
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # Display the resulting frame
    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

当然,您不想显示图像,但是所有的处理都可以在那里完成。
记得睡眠几百毫秒,这样树莓派就不会过热了。
编辑:
“我应该怎么做呢?我一直使用“img = cv2.imread('image1.jpg')”。我需要使用什么来正确获取“img”变量?ret是什么? :)”
“ret”表示读取是否成功。如果失败,则退出程序。
读取的“frame”无非就是您的“img = cv2.imread('image1.jpg')”,因此您的检测代码应该完全相同。
唯一的区别是您的图像不需要保存和重新打开。另外,为了调试目的,您可以保存记录的图像,例如:
import cv2, time

cap = cv2.VideoCapture(0)

ret, frame = cap.read()
if ret:
    cv2.imwrite(time.strftime("%Y%m%d-%H%M%S"), frame)

cap.release()

我还有一个问题,当我在程序末尾使用time.sleep(0.15)时,然后跳回到开头并尝试读取一帧,如果帧发生变化,会对我的程序造成干扰吗?或者它只是在这0.15秒内跳过我程序中没有使用的帧(如果有的话)? - anthrx
我不知道会发生什么,但是阅读文档,我怀疑读取调用可能已经为您睡眠并且您实际上不需要单独的休眠。但说实话,这些文档并不那么精确。我建议您首先在台式电脑上测试所有代码和网络摄像头,然后再部署到 PI 上,这样管理起来就不那么容易了。 - Simon Kirsten
好的,我刚刚尝试启动程序,现在出现了错误,基本上是说:“对象没有属性<item> <height> <width>”之类的东西。 - anthrx

0

你可以使用picamera来获取图像。

为了使其“实时”,你可以每X毫秒获取一次数据。你需要根据你的硬件性能(和openCV算法的复杂度)设置X。

这里有一个例子(来自http://picamera.readthedocs.io/en/release-1.10/api_camera.html#picamera.camera.PiCamera.capture_continuous),如何使用picamera每秒获取60张图像:

import time
import picamera
with picamera.PiCamera() as camera:
    camera.start_preview()
    try:
        for i, filename in enumerate(camera.capture_continuous('image{counter:02d}.jpg')):
            print(filename)
            time.sleep(1)
            if i == 59:
                break
    finally:
        camera.stop_preview()

我看不出你建议降低捕获速率对树莓派的处理能力有任何影响。我们希望图像处理尽可能快。因此,捕获图像,分析结果,做出反应,重复此过程,要尽可能快。如果你可以更快,而且是合理的,那么你可以暂停。但“节约”时间本身并没有内在价值-你不会在以后得到回报。 - deets

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接