本教程重點(diǎn)介紹如何在Raspberry上使用OpenCV Pi可以讀取,顯示和寫(xiě)入圖像。這是開(kāi)始使用OpenCV時(shí)需要了解的基本內(nèi)容之一,也是最常用的代碼部分之一。
如果您希望創(chuàng)建一個(gè)在家中漫游并在您不在家時(shí)拍照的監(jiān)控機(jī)器人,那么本教程是您需要采取的首要步驟之一。
讓我們首先瀏覽用于讀取,顯示和保存圖像的每個(gè)函數(shù)。然后,我們可以編寫(xiě)代碼,以便我們的程序使用Pi相機(jī)來(lái)檢測(cè)面部,在檢測(cè)到的面部周圍創(chuàng)建一個(gè)矩形,然后拍攝一張照片。
在Raspberry Pi上使用OpenCV讀取圖像
用于讀取圖像的函數(shù)是 cv2.imread()。此函數(shù)有兩個(gè)參數(shù)。
第一個(gè)參數(shù)采用圖像的名稱。如果圖像在工作目錄中,那么您只需編寫(xiě)其名稱即可。否則,你必須給出圖像的完整路徑。
第二個(gè)參數(shù)采用告訴程序應(yīng)該如何讀取圖像的標(biāo)志。
1或cv2.IMREAD_COLOR 加載彩色圖像。它使用默認(rèn)顏色并忽略圖像透明度。
0或cv2.IMREAD_GRAYSCALE 加載灰度圖像。
-1或cv2。 IMREAD_UNCHANGED 加載圖像,包括alpha通道。
image = cv2.imread(‘obama.jpg’, 0)
image = cv2.imread(‘obama.jpg’, cv2.IMREAD_GRAYSCALE)
我們可以使用上面任何一行來(lái)讀取圖像。
使用Raspberry Pi在OpenCV中顯示圖像
用于顯示圖像的函數(shù)是 cv2.imshow()。此函數(shù)還有兩個(gè)參數(shù):第一個(gè)參數(shù)是窗口名稱,第二個(gè)參數(shù)是圖像的名稱。
注意:您無(wú)法更改此函數(shù)創(chuàng)建的窗口的大小。
還有一個(gè)函數(shù)( cv2.namedWindow())可用于創(chuàng)建窗口,然后使用 cv2.imshow()來(lái)顯示圖像在里面。您將能夠以這種方式調(diào)整圖像大小。
cv2.namedWindow(‘Obama’, cv2.WINDOW_NORMAL)
cv2.imshow(‘Obama’, image)
使用Raspberry Pi在OpenCV中寫(xiě)入圖像
寫(xiě)入圖像的函數(shù)是 cv2.imwrite(),它還有兩個(gè)參數(shù):第一個(gè)參數(shù)是圖像文件名(圖像將以此文件名保存),第二個(gè)參數(shù)是您要保存的圖像的名稱。
您還可以將圖像保存為其他格式,如下一行將JPG圖像更改為PNG格式。
cv2.imwrite(‘newobama.png’, image)
讀取,顯示和寫(xiě)入圖像的Python代碼
運(yùn)行代碼后,會(huì)出現(xiàn)類似下面的輸出窗口。如果按‘s’,程序會(huì)以灰度格式保存圖像,但如果按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()是一個(gè)鍵盤(pán)綁定功能,等待任何鍵盤(pán)事件的指定時(shí)間。它需要一個(gè)參數(shù),即以毫秒為單位的時(shí)間。如果在指定的時(shí)間范圍內(nèi)按下該鍵,程序?qū)⒗^續(xù)。傳遞0意味著它將無(wú)限期地等待一個(gè)鍵。
cv2.destroyAllWindows()函數(shù)會(huì)破壞所有打開(kāi)的窗口。如果要銷毀特定窗口,請(qǐng)使用 cv2.destroyWindow()并將窗口名稱作為參數(shù)傳遞。
在Raspberry Pi上使用OpenCV捕獲圖像和檢測(cè)面
現(xiàn)在根據(jù)我們學(xué)到的東西,讓我們編寫(xiě)一個(gè)演示代碼,在代碼被檢測(cè)到之前一直持續(xù)觀察。在檢測(cè)到面部后,它將在該面周圍形成一個(gè)矩形并保存圖像。
# 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()
嘗試運(yùn)行此代碼,您應(yīng)該能夠看到寫(xiě)入相應(yīng)目錄的新圖像文件突出顯示圖片中的一個(gè)面。
-
OpenCV
+關(guān)注
關(guān)注
31文章
635瀏覽量
41338 -
樹(shù)莓派
+關(guān)注
關(guān)注
116文章
1707瀏覽量
105610
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論