本教程重點介紹如何在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)
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)
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()
嘗試運行此代碼,您應該能夠看到寫入相應目錄的新圖像文件突出顯示圖片中的一個面。
-
OpenCV
+關注
關注
31文章
635瀏覽量
41463 -
樹莓派
+關注
關注
117文章
1710瀏覽量
105807
發布評論請先 登錄
相關推薦
評論