OpenCV & Python - 实时图像(帧)处理
OpenCV & Python - Real time image (frame) processing
我们在学校做一个项目,需要进行基本的图像处理。我们的目标是将每个视频帧用于 Raspberry Pi 并进行实时图像处理。
我们已经尝试将 raspistill 包含在我们的 python-程序中,但到目前为止没有任何效果。我们项目的目标是在图像处理的帮助下设计一辆遵循 blue/red/whatever 彩色线条的遥控车。
我们认为制作一个 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:
您可以使用 picamera 获取图像。
为了达到 "real time",您可以每 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()
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 才不会过热。
编辑:
"how exactly would I go about it though. I used "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()
我们在学校做一个项目,需要进行基本的图像处理。我们的目标是将每个视频帧用于 Raspberry Pi 并进行实时图像处理。
我们已经尝试将 raspistill 包含在我们的 python-程序中,但到目前为止没有任何效果。我们项目的目标是在图像处理的帮助下设计一辆遵循 blue/red/whatever 彩色线条的遥控车。
我们认为制作一个 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:
您可以使用 picamera 获取图像。
为了达到 "real time",您可以每 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()
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 才不会过热。
编辑:
"how exactly would I go about it though. I used "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()