电子说
本教程重点介绍如何在Raspberry上使用OpenCV Pi可以读取,显示和写入图像。这是开始使用OpenCV时需要了解的基本内容之一,也是最常用的代码部分之一。
如果您希望创建一个在家中漫游并在您不在家时拍照的监控机器人,那么本教程是您需要采取的首要步骤之一。
让我们首先浏览用于读取,显示和保存图像的每个函数。然后,我们可以编写代码,以便我们的程序使用Pi相机来检测面部,在检测到的面部周围创建一个矩形,然后拍摄一张照片。
在Raspberry Pi上使用OpenCV读取图像
用于读取图像的函数是 cv2.imread()。此函数有两个参数。
第一个参数采用图像的名称。如果图像在工作目录中,那么您只需编写其名称即可。否则,你必须给出图像的完整路径。
第二个参数采用告诉程序应该如何读取图像的标志。
1或cv2.IMREAD_COLOR 加载彩色图像。它使用默认颜色并忽略图像透明度。
0或cv2.IMREAD_GRAYSCALE 加载灰度图像。
-1或cv2。 IMREAD_UNCHANGED 加载图像,包括alpha通道。
image = cv2.imread(‘obama.jpg’, 0)
or
image = cv2.imread(‘obama.jpg’, cv2.IMREAD_GRAYSCALE)
我们可以使用上面任何一行来读取图像。
使用Raspberry Pi在OpenCV中显示图像
用于显示图像的函数是 cv2.imshow()。此函数还有两个参数:第一个参数是窗口名称,第二个参数是图像的名称。
注意:您无法更改此函数创建的窗口的大小。
还有一个函数( cv2.namedWindow())可用于创建窗口,然后使用 cv2.imshow()来显示图像在里面。您将能够以这种方式调整图像大小。
cv2.namedWindow(‘Obama’, cv2.WINDOW_NORMAL)
cv2.imshow(‘Obama’, image)
使用Raspberry Pi在OpenCV中写入图像
写入图像的函数是 cv2.imwrite(),它还有两个参数:第一个参数是图像文件名(图像将以此文件名保存),第二个参数是您要保存的图像的名称。
您还可以将图像保存为其他格式,如下一行将JPG图像更改为PNG格式。
cv2.imwrite(‘newobama.png’, image)
读取,显示和写入图像的Python代码
运行代码后,会出现类似下面的输出窗口。如果按‘s’,程序会以灰度格式保存图像,但如果按ESC键,它将退出窗口而不保存图像。
# Import OpenCV library
import cv2
# Load color image in grayscale
image = cv2.imread(‘obama.jpg’, 0)
#or
#image = cv2.imread(‘obama.jpg’, cv2.IMREAD_GRAYSCALE)。
# Create the resizeable window
cv2.namedWindow(‘Obama’, cv2.WINDOW_NORMAL)
# Display the image
cv2.imshow(‘Obama’, image)
# Wait until we get a key
k=cv2.waitKey(0)
# If pressed key is ‘s’
if k == ord(‘s’):
# Save the image
cv2.imwrite(‘convertedimage.jpg’, image)
# Destroy all windows
cv2.destroyAllWindows()
# If pressed key is ESC
elif k == 27:
# Destroy all windows
cv2.destroyAllWindows()
cv2.waitkey()是一个键盘绑定功能,等待任何键盘事件的指定时间。它需要一个参数,即以毫秒为单位的时间。如果在指定的时间范围内按下该键,程序将继续。传递0意味着它将无限期地等待一个键。
cv2.destroyAllWindows()函数会破坏所有打开的窗口。如果要销毁特定窗口,请使用 cv2.destroyWindow()并将窗口名称作为参数传递。
在Raspberry Pi上使用OpenCV捕获图像和检测面
现在根据我们学到的东西,让我们编写一个演示代码,在代码被检测到之前一直持续观察。在检测到面部后,它将在该面周围形成一个矩形并保存图像。
# import the necessary packages
from picamera.array import PiRGBArray
from picamera import PiCamera
import cv2
import numpy as np
# initialize the camera and grab a reference to the raw camera capture
camera = PiCamera()
camera.resolution = (640, 480)
camera.framerate = 30
rawCapture = PiRGBArray(camera, size=(640, 480))
# Load a cascade file for detecting faces
face_cascade = cv2.CascadeClassifier(“haarcascade_frontalface_default.xml”);
# capture frames from the camera
for frame in camera.capture_continuous(rawCapture, format=“bgr”, use_video_port=True):
# grab the raw NumPy array representing the image, then initialize the timestamp
# and occupied/unoccupied text
image = frame.array
# Convert to grayscale
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
# Look for faces in the image using the loaded cascade file
faces = face_cascade.detectMultiScale(gray, 1.1, 5)
# Show the frame
cv2.imshow(“Frame”, image)
# Wait for key
key = cv2.waitKey(1) & 0xFF
# clear the stream in preparation for the next frame
rawCapture.truncate(0)
faceDetected = False
# Draw a rectangle around every found face
for (x,y,w,h) in faces:
faceDetected = True
# Create rectangle around the face
cv2.rectangle(image,(x,y),(x+w,y+h),(255,255,0),2)
# Save the image
cv2.imwrite(“result.jpg”, image)
if faceDetected == True:
break
cv2.destroyAllWindows()
尝试运行此代码,您应该能够看到写入相应目录的新图像文件突出显示图片中的一个面。
全部0条评论
快来发表一下你的评论吧 !