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

时间:2016-06-12 12:39:10

标签: python opencv raspberry-pi3

我们正在学校做一个需要进行基本图像处理的项目。我们的目标是为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:

提前感谢,anthrx。

2 个答案:

答案 0 :(得分:4)

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

This OpenCV documentation提供了一个简单示例:

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

当然,您不想显示图像,但可以在那里完成所有处理。

记得睡几百毫秒,这样pi不会过热。

编辑:

“我究竟会怎么做。我一直使用”img = cv2.imread('image1.jpg')。我需要使用什么才能获得“img”变量?我该怎么用?什么是ret,for?:)“

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

答案 1 :(得分: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()