6.1樹莓派基本操作
目前提供了三個應用程序,分別為:raspistill、raspivid、raspistillyuv。其中 raspistill 和 raspistillyuv 非常相似,并且都是用于捕捉圖像,而 raspivid 用于捕捉視頻。
所有應用程序均基于命令行方式運行,通過 OpenMAX 的 mmal API 進行編寫。OpenMAX 的 mmal API 提供了更易使用的系統(tǒng)組件。注意,mmal 是一個由 Broadcom 為 Videocore 4 系統(tǒng)定制的 API。
應用程序使用了四個 OpenMAX(mmal)組件:camera(攝像)、preview(預覽)、encoder(編碼)、null_sink。所有應用程序均使用了攝像組件,raspistill 使用了圖像編碼組件,raspivid 使用了視頻編碼組件,raspistillyuv 沒有使用編碼組件,而是直接將 YUV 或 RGB 從攝像組件輸出到文件。
預覽顯示為可選參數(shù),但是可以用于全屏或輸出到指定的顯示器顯示區(qū)域進行顯示。如果預覽被禁用,那么 null_silk 組件將會對預覽幀進行“吸收”。這是由于盡管不需要攝像頭生成供顯示所用的的預覽幀,但是仍需要使用它們進行曝光計算和白平衡設置的緣故。
此外,還可以省略文件名參數(shù),這樣既可以直接預覽顯示而不寫入文件,或者直接輸出到標準輸出設備上。命令行幫助可以通過直接輸入應用程序名稱獲得。
6.1.1安裝攝像頭硬件
警告:攝像頭對靜電非常敏感。如果您在安裝攝像頭電路板時沒有防靜電手環(huán),可以嘗試觸摸一下水龍頭、金屬水槽或其它類似的東西即可。
攝像頭電路板與 Raspberry Pi 通過一條 15 芯的排線進行連接。僅有兩個連接座需要連接,排線需要安裝到攝像頭電路板和 Raspberry Pi 上。您需要正確安裝,否則攝像頭無法工作。對于攝像頭電路板,排線末端的藍色標記應該背對著電路板。而 Raspberry Pi 部分,藍色標記應該正對著網(wǎng)絡接口方向。
盡管兩部分連接座不盡相同,但它們的工作方式很相似。對于 Raspberry Pi,拉起連接座兩端的卡扣。它應該很容易拉起,并能夠輕微活動。把排線完全插入到連接座中,并保證豎直,然后輕輕按下兩端的卡扣。攝像頭電路板方面,也需要您將卡扣向電路板相反方向拉開,然后輕輕插入排線,最后將卡扣推回。攝像頭電路板的連接座與 Pi 上的區(qū)別就在這里。
6.1.2安裝攝像頭軟件
執(zhí)行下文介紹的命令行進行下載并安裝最新的內(nèi)核,GPU 固件及應用程序。您需要連接到互聯(lián)網(wǎng)才可以實現(xiàn)以下操作。
$sudo apt-get update
$sudo apt-get upgrade
接下來,您首先需要在 Raspberry Pi 的 raspi-config 程序中啟用攝像頭的支持。
1)連接攝像頭與樹莓派
2)修改樹莓派配置,開啟攝像頭模塊。
sudo raspi-config

圖1
將光標移動到攝像頭選項(Camera option)處,并選擇啟用(Enable)。在退出 raspi-config 時會要求您重新啟動。啟用選項是為了確保重啟后 GPU 固件能夠正確運行(包括攝像頭驅動和調節(jié)電路),并且 GPU 從主內(nèi)存劃分到了足夠的內(nèi)存使攝像頭能夠正確運行。

圖2
測試系統(tǒng)已經(jīng)完成安裝并正常工作,可嘗試以下命令:
$raspistill -v -o test.jpg
這將顯示來自攝像頭 5 秒鐘的預覽圖像,并且拍攝一張照片,然后保存為文件 test.jpg,同時顯示出需要相關信息。
6.1.3通用命令行參數(shù)
? 預覽窗口
–preview, -p 預覽窗口設置 <‘x,y,w,h’>
允許用戶在屏幕上定義預覽窗口的大小和位置。注意,這將在所有其它窗口/圖像的上層顯示。
–fullscreen, -f 全屏預覽模式
強制預覽屏幕全屏顯示。注意,這將會保留輸入圖像的長寬比例,所以可能會在圖像的邊緣出現(xiàn)填充條。
–nopreview, -n 不顯示預覽窗口
完全禁用預覽窗口。注意,盡管預覽窗口被禁用,但攝像頭仍然在進行處理,所以會繼續(xù)消耗資源。
–opacity, -op 設置預覽窗口透明度
設置預覽窗口的透明度。0 為完全透明,255 為完全不透明。
? 攝像頭控制參數(shù)
–sharpness, -sh 設置圖像銳度(-100 – 100)
設置圖像的銳度,默認為 0。
–contrast, -co 設置圖像對比度(-100 – 100)
設置圖像的對比度,默認為 0。
–brightness, -br 設置圖像亮度(0 – 100)
設置圖像的亮度,默認為 50。0 為最暗,100 為最亮。
–saturation, -sa 設置圖像飽和度(-100 – 100)
設置圖像色彩飽和度。默認為 0。
–ISO, -ISO 設置捕捉 ISO
為捕捉圖像設置 ISO。范圍為 100 到 800。
–vstab, -vs 打開視頻穩(wěn)定
僅用于視頻模式,用于開啟視頻穩(wěn)定。
–ev, -ev 設置曝光補償
設置圖像的曝光補償。范圍為 -10 到 10,默認為 0。
–exposure, -ex 設置曝光模式
可能用到的參數(shù)為:
auto – 使用自動曝光模式
night – 夜間拍攝模式
nightpreview -夜間預覽拍攝模式(暫且這么稱呼)
backlight – 逆光拍攝模式
spotlight – 聚光燈拍攝模式
sports – 運動拍攝模式(高速快門等)
snow – 雪景優(yōu)化拍攝模式
beach – 海灘優(yōu)化拍攝模式
verylong – 長時間曝光拍攝模式
fixedfps – 幀約束拍攝模式
antishake – 防抖模式
fireworks – 煙火優(yōu)化拍攝模式
注意,不是所有的設置都會在對攝像頭進行微調時得到相應作用。
–awb, -awb 設置自動白平衡
可能用到的參數(shù)為:
off – 關閉白平衡測算
auto – 自動模式(默認)
sun – 日光模式
cloud – 多云模式
shade – 陰影模式
tungsten – 鎢燈模式
fluorescent – 熒光燈模式
incandescent – 白熾燈模式
flash – 閃光模式
horizon – 地平線模式
–imxfx, -ifx 設置圖像特效
設置應用于圖像上的特效
可能用到的參數(shù)為:
none – 無特效(默認)
negative – 反色圖像
solarise – 曝光過度圖像
posterize – 色調圖像
whiteboard – 白板特效
blackboard – 黑板特效
sketch – 素描風格特效
denoise – 降噪圖像
emboss – 浮雕圖像
oilpaint – 油畫風格特效
hatch – 草圖特效
gpen – 馬克筆特效
pastel – 柔化風格特效
watercolour – 水彩風格特效
film – 膠片顆粒風格特效
blur – 模糊圖像
saturation – 色彩飽和圖像
colourswap – 暫未可用
washedout – 暫未可用
posterise – 暫未可用
colourpoint – 暫未可用
colourbalance – 暫未可用
cartoon – 暫未可用
–colfx, -cfx 設置色彩特效
指定圖像 U 和 V 通道的參數(shù)(范圍 0 到 255)。例如:–colfx 128:128 將得到一張單色圖像。
–metering, -mm 設置測光模式
為預覽和捕捉指定測光模式
可能用到的參數(shù)為:
average – 全畫面平衡測光
spot – 點測光
backlit – 模擬背光圖像
matrix – 陣列測光
–rotation, -rot 設置圖像旋轉(0 – 359)
對取景器和最終得到的圖像進行旋轉??梢越邮?0 以上任何值,但由于硬件限制,只支持 0、90、180、270 度。
–hflip, -hf 設置水平翻轉
水平翻轉預覽和保存的圖像。
–vflip, -vf 設置垂直翻轉
垂直翻轉預覽和保存的圖像。
–roi, -roi 設置傳感器感光區(qū)域
允許指定用于預覽和捕捉的源所使用的傳感器區(qū)域。該功能中 x 和 y 參數(shù)指定了坐上角的坐標,以及定義了寬度和高度值,并且所有值都為標準化坐標(0.0 到 1.0)。那么,感光區(qū)域設置為橫向和縱向都為一半,并且寬度和高度都為傳感器的四分之一時,可以寫為:
-roi 0.5,0.5,0.25,0.25
–shutter, -ss 設置快門速度
設置快門的速度為指定的值(單位為微秒)。據(jù)當前的考證,目前未定義時,快門速度上限大約為 330000us(330ms 或 0.33s)。
6.1.4應用程序專有設置
? raspistill
–width, -w 設置圖像寬度
–height, -h 設置圖像高度
–quality, -q 設置 JPEG 品質,品質為 100 時幾乎等同于未壓縮。75 相對是比較好的選擇。
–raw, -r 向 JPEG 元數(shù)據(jù)中添加 RAW 信息,該參數(shù)將從攝像頭獲取到的 RAW 信息插入到 JPEG 元數(shù)據(jù)中。
–output, -o 輸出文件名,指定輸出的文件名。如果不指定,將不保存到文件。如果文件名為“-”,將輸出發(fā)送至標準輸出設備。
–latest, -l 鏈接最后一幀到文件名,基于該名稱做一個指向最后一幀的文件系統(tǒng)鏈接。
–verbose, -v 在運行過程中輸出詳細信息,在程序運行過程中,輸出調試/詳細信息。
–timeout, -t 獲取圖片前的時間,程序將執(zhí)行指定的時長,然后進行獲取操作(前提是 output 已指定)。如果未指定,將設置為 5 秒。
–timelapse, -tl 間隔拍攝模式,指定多次拍攝之間所間隔的毫秒值。注意,您需要在文件名中加入 %04d 做為畫面計數(shù)。
-t 30000 -tl 2000 -o image%04d.jpg,將會在 30 秒的時間內(nèi),每兩秒拍攝一次,并且將文件命名為:image1.jpg、image0002.jpg…image0015.jpg。注意 %04d 表示在文件名中數(shù)字部分加入前導零,使其成為 4 位數(shù)。例如,%08d 將生成 8 位數(shù)字。如果間隔時間設置為 0,程序將不間斷(取決于系統(tǒng)負擔及存儲速度)進行拍攝。不過需要注意,每次捕捉前還是會有 30ms 的最小暫停時間,用于曝光計算操作。
–thumb, -th 設置縮略圖參數(shù)(x:y:quality),允許指定插入到 JPEG 文件中縮略圖信息。如果不指定,將為默認的 64×48 質量為 35 的縮略圖。如果設置為 –thumb none,那么將不會向文件中插入縮略圖信息。文件的尺寸也會稍微變小。
–demo, -d 運行演示模式,該參數(shù)將循環(huán)使用所有攝像頭參數(shù),并且不會捕捉。而且無論是否完成所有的循環(huán),在超時周期到達時都會停止演示操作。循環(huán)之前的時間需要設置毫秒值。
–encoding, -e 指定輸出文件的編碼,可用的參數(shù)為 jpg、bmp、gif、png。注意,未被硬件加速支持的圖像格式(gif、png、bmp)在保存的時候要比 jpg 格式耗時更長。還需要注意,文件擴展名在編碼時將被完全忽略。
–exif, -x 在捕捉的內(nèi)容中加入 EXIF 標簽(格式為 ‘key=value’),允許在 JPEG 圖像中插入特定的 EXIF 標簽。您可以插入 32 條記錄。這是非常實用的功能,比如插入 GPS 元數(shù)據(jù)。例如設置經(jīng)度。
–exif GPS.GPSLongitude=5/1,10/1,15/100,該命令將會設置經(jīng)度為 5 度 10 分 15 秒。查看 EXIF 文檔獲得所有可用標簽的詳細信息。支持的標簽如下:
IFD0. 或 IFD1.
< ImageWidth, ImageLength, BitsPerSample, Compression, PhotometricInterpretation, ImageDescription, Make, Model, StripOffsets, Orientation, SamplesPerPixel, RowsPerString, StripByteCounts, Xresolution, Yresolution, PlanarConfiguration, ResolutionUnit, TransferFunction, Software, DateTime, Artist, WhitePoint, PrimaryChromaticities, JPEGInterchangeFormat, JPEGInterchangeFormatLength, YcbCrCoefficients, YcbCrSubSampling, YcbCrPositioning, ReferenceBlackWhite, Copyright>
EXIF.
<ExposureTime, FNumber, ExposureProgram, SpectralSensitivity, a ISOSpeedRatings, OECF, ExifVersion, DateTimeOriginal, DateTimeDigitized, ComponentsConfiguration, CompressedBitsPerPixel, ShutterSpeedValue, ApertureValue, BrightnessValue, ExposureBiasValue, MaxApertureValue, SubjectDistance, MeteringMode, LightSource, Flash, FocalLength, SubjectArea, MakerNote, UserComment, SubSecTime, SubSecTimeOriginal, SubSecTimeDigitized, FlashpixVersion, ColorSpace, PixelXDimension, PixelYDimension, RelatedSoundFile, FlashEnergy, SpacialFrequencyResponse, FocalPlaneXResolution, FocalPlaneYResolution, FocalPlaneResolutionUnit, SubjectLocation, ExposureIndex, SensingMethod, FileSource, SceneType, CFAPattern, CustomRendered, ExposureMode, WhiteBalance, DigitalZoomRatio, FocalLengthIn35mmFilm, SceneCaptureType, GainControl, Contrast, Saturation, Sharpness, DeviceSettingDescription, SubjectDistanceRange, ImageUniqueID>
GPS.
<GPSVersionID, GPSLatitudeRef, GPSLatitude, GPSLongitudeRef, GPSLongitude, GPSAltitudeRef, GPSAltitude, GPSTimeStamp, GPSSatellites, GPSStatus, GPSMeasureMode, GPSDOP, GPSSpeedRef, GPSSpeed, GPSTrackRef, GPSTrack, GPSImgDirectionRef, GPSImgDirection, GPSMapDatum, GPSDestLatitudeRef, GPSDestLatitude, GPSDestLongitudeRef, GPSDestLongitude, GPSDestBearingRef, GPSDestBearing, GPSDestDistanceRef, GPSDestDistance, GPSProcessingMethod, GPSAreaInformation, GPSDateStamp, GPSDifferential>
EINT.
<InteroperabilityIndex, InteroperabilityVersion, RelatedImageFileFormat, RelatedImageWidth, RelatedImageLength>
【注意】有部分標簽將會由攝像頭系統(tǒng)自動設置,但是會被命令行執(zhí)行的 EXIF 操作所覆蓋。如果設置為 –exif none,那么將不會向文件中插入 EXIF信息。文件的尺寸也會稍微變小。
–fullpreview, -fp 全預覽模式,這將使預覽窗口運行于全分辨率捕捉模式。該模式最大幀率為 15fps,并且預覽將和捕捉擁有相同的可視區(qū)域。在不進行模式轉換時,捕捉動作將進行的更迅速。該功能目前還在開發(fā)中。
–keypress, -k 按鍵模式,攝像頭會運行(-t)參數(shù)指定的時間,并且每次按下回車鍵時進行一次捕捉。在超時設置到達前按 X 鍵然后按回車鍵將退出程序。如果超時時間設置為 0,攝像頭將一直工作,直到按下 X 鍵和回車鍵。使用 verbose(-v)參數(shù)可以顯示輸入確認提示,否則不會有任何提示。
–signal, -s 信號模式,攝像頭會運行(-t)參數(shù)指定的時間,并且每次向攝像進程發(fā)送 USR1 信號時進行一次捕捉。該操作可以通過發(fā)送 kill 命令進行終止。您可以使用“pgrep raspistill”命令找到攝像進程的 ID。
kill -USR1
? raspistillyuv
raspistillyuv 的許多選項與 raspistill 是相同的。本節(jié)將對不同的部分進行講解。
不支持的選項:
–exif, –encoding, –thumb, –raw, –quality
擴展選項:
–rgb, -rgb 以 RGB888 形式保存未壓縮數(shù)據(jù),該選項強制圖像保存為每個通道為 8 bits 的 RGB 格式,而不是 YUV420 格式。
【注意】在 raspistillyuv 中所保存的圖像在緩沖區(qū)中水平尺寸封裝為可被 16 整除(所以可能會在每行的結尾都會出現(xiàn)無用的字節(jié)以使寬度可被 16 整除)。緩沖區(qū)也會將垂直方向封裝為可被 16 整除,在 YUV 模式中,每個 Y、U、V 平面都會使用該方式進行封裝。
? raspivid
–width, -w 設置圖像寬度,視頻的寬度。范圍為 64 到 1920。
–height, -h 設置圖像高度,視頻的高度。范圍為 64 到 1080。
–bitrate, -b 設置碼率。使用比特/秒為單位,所以 10Mbits/s 需要輸入 -b 10000000。對于 H264 編碼的 1080p30 高清視頻,碼率需要在 15Mbits/s 或以上。碼率最大為 25Mbits/s(-b 25000000),但大于 17Mbits/s 時,在 1080p30 中并沒有太大區(qū)別。
–output -o 輸出文件名,指定輸出的文件名。如果不指定,將不保存到文件。如果文件名為“-”,將輸出發(fā)送至標準輸出設備。
–verbose, -v 在運行過程中輸出詳細信息,在程序運行過程中,輸出調試/詳細信息。
–timeout, -t 獲取圖片前的時間,程序將執(zhí)行指定的時長,然后進行獲取操作(前提是 output 已指定)。如果未指定,將設置為 5 秒。設置為 0 意味著程序將一直運行,直到按下 Ctrl-C 才會停止。
–demo, -d 運行演示模式,該參數(shù)將循環(huán)使用所有攝像頭參數(shù),并且不會捕捉。而且無論是否完成所有的循環(huán),在超時周期到達時都會停止演示操作。循環(huán)之前的時間需要設置毫秒值。
–framerate, -fps 指定錄制的視頻每秒的畫面數(shù)量,目前,最小的幀率為 2fps,最大為 30fps。似乎將來會有所改變。
–penc, -e 在編碼完成后顯示預覽圖像,開啟該選項會在壓縮完成后顯示預覽圖像。顯示在預覽窗口中的圖像會因為壓縮的原因出現(xiàn)失真。正常情況下,預覽將會顯示攝像頭輸出的原始圖像。該功能在未來的版本中可能不再可用。
–intra, -g 指定幀內(nèi)刷新周期(關鍵幀率/畫面組),為錄制的視頻設置幀內(nèi)刷新周期(畫面組)率。H.264 視頻在每個幀內(nèi)刷新周期中都使用了 I-frame。該選項指定了每個 I-frame 之間幀的數(shù)量。數(shù)字越大,生成的視頻尺寸越小,數(shù)字越小,視頻流將越龐大,直至出錯。
–qp, -qp 設置量化參數(shù),為視頻流設置初始量化參數(shù)。范圍從 10 到 40,并且對所錄制視頻的質量有極大的影響。值越大,質量越低,并且文件尺寸越小。碼流設置為 0,并結合此參數(shù)一起使用,可用來設置一個完全動態(tài)碼流的視頻。
–profile, -pf 為錄制的視頻指定 H264 配置文件,為錄制的視頻指定 H264 配置文件。選項為:baseline、main、high。
–inline, -ih Insert PPS, SPS headers 插入 PPS,SPS 頭,強制視頻流的 I-frame 都包含 PPS 和 SPS 頭信息。某些視頻封裝格式需要該信息。例如 Apple HLS。這些頭信息體積很小,所以不會讓文件的尺寸增加太多。
–timed, -td 設置定時切換捕捉和暫停,該選項可以使視頻捕捉在特定的時間里暫停并重新開始記錄。需要指定開啟時間和關閉時間兩個值。開啟時間是視頻的捕捉時長,關閉時間是暫停的時長。總錄制時長是又超時選項進行定義的。注意,由于開啟時間和關閉時間的設置原因,錄制時長將略微比超時設置的時間要長。
例如
$raspivid -o test.h264 -t 25000 -timed 2500,5000
將進行 25 秒的錄制操作。錄制操作包括若干個 2500 毫秒(2.5 秒)錄制和 5000 毫秒(5秒)暫停的操作,并且重復時長超過 20 秒。所以該錄制過程中實際只錄制了 10 秒的內(nèi)容。包括 4 段 2.5 秒的視頻片斷 = 被若干個 5 秒鐘暫停操作分隔開的 10 秒鐘視頻。
–keypress, -k 使用回車鍵在錄制和暫停兩種狀態(tài)間進行切換,每次點擊回車鍵將會暫停或重新開始錄制進程。點擊 X 鍵后點擊回車鍵將停止錄制并關閉程序。注意,超時設置值將影響錄制結束時間,但僅在每次回車鍵點擊后進行檢查,所以如果系統(tǒng)正在等待按鍵操作,盡管超時設置已過期,錄制進程退出前也會等待按鍵操作。
–signal, -s 使用 SIGUSR1 信號在錄制和暫停兩種狀態(tài)間進行切換,向 Raspivid 進程發(fā)送 USR1 信號來切換錄制和暫停。該操作可以通過使用 kill 命令來實現(xiàn)。您可以使用“pgrep raspivid” 命令找到 raspivid 的進程 ID。
kill -USR1
【注意】超時設置值將影響錄制結束時間,但僅在每次發(fā)送 SIGUSR1 信號后進行檢查,所以如果系統(tǒng)正在等待信號,盡管超時設置已過期,錄制進程退出前也會等待信號的發(fā)送操作。
–initial, -i 定義啟動時的初始狀態(tài)。定義攝像頭初始狀態(tài)為暫停或立即開始錄像。選項可以為“record”(錄像)或“pause”(暫停)。注意,如果您設置的超時時長很短,而且初始狀態(tài)設置為“暫停”,那么將不會錄制任何輸出的內(nèi)容。
–segment, -sg 將視頻流分段存儲到多個文件,與存儲在單個文件中不同,該參數(shù)將視頻分段存儲在以毫秒為單位所指定長度的數(shù)個文件中。為了將生成的文件命名為不同的名稱,您需要在文件名中合適的位置添加 %04d 或類似的參數(shù)來讓文件名中顯示計數(shù)值。例如:
–segment 3000 -o video%04d.h264,將分割成每段長度 3000 毫秒(3 秒)并且命名為 video0001.h264,video0002.h264 等。每個段落都是可無縫連接的(段落之間不會丟幀),但每個片段的長度將取決于幀內(nèi)周期值,原因是每個分割的段落都需要起始于 I-frame 處。因此,每個段落都會等于或大于指定的時間長度。
–wrap, -wr 設置最大分段數(shù),當輸出分段視頻時,該參數(shù)設置了最大分段數(shù),并且達到最大值時,將返回到初始的第一個段落。該參數(shù)賦予了錄制分段視頻的功能,但是將覆蓋之前生成的文件。所以,如果設置為 4,那么上面的例子中所生成的文件名為 video0001.h264,video0002.h264,video0003.h264,video0004.h264。而且,一旦 video0004.h264 文件錄制完畢后,計數(shù)將回到 1,并且 video0001.h264 將被覆蓋。
–start, -sn 設置初始段落數(shù),當輸出分段視頻時,該參數(shù)為初始的段落數(shù),它允許從指定的段落恢復之前的錄制操作。默認值為 1。
6.1.5應用示例
? 圖像捕捉
默認情況下,傳感器將以其支持的最高分辨率進行捕捉??梢栽诿钚兄型ㄟ^使用 -w 和 -h 參數(shù)進行更改。
# 兩秒鐘(時間單位為毫秒)延遲后拍攝一張照片,并保存為 image.jpg
raspistill -t 2000 -o image.jpg
# 拍攝一張自定義大小的照片。
raspistill -t 2000 -o image.jpg -w 640 -h 480
# 降低圖像質量,減小文件尺寸
raspistill -t 2000 -o image.jpg -q 5
# 強制使預覽窗口出現(xiàn)在坐標為 100,100 的位置,并且尺寸為寬 300 和高 200 像素。
raspistill -t 2000 -o image.jpg -p 100,100,300,200
# 禁用預覽窗口
raspistill -t 2000 -o image.jpg -n
# 將圖像保存為 PNG 文件(無損壓縮格式,但是要比 JPEG 速度慢)。注意,當選擇圖像編碼時,文件擴展名將被忽略。
raspistill -t 2000 -o image.png –e png
# 向 JPEG 文件中添加一些 EXIF 信息。該命令將會把作者名稱標簽設置為 Dreamcolor,GPS 海拔高度為 123.5米。
raspistill -t 2000 -o image.jpg -x IFD0.Artist=Dreamcolor -x GPS.GPSAltitude=1235/10
# 設置浮雕風格圖像特效
raspistill -t 2000 -o image.jpg -ifx emboss
# 設置 YUV 圖像的 U 和 V 通道為指定的值(128:128 為黑白圖像)
raspistill -t 2000 -o image.jpg -cfx 128:128
# 僅顯示兩秒鐘預覽圖像,而不對圖像進行保存。
raspistill -t 2000
# 間隔獲取圖片,在 10 分鐘(10 分鐘 = 600000 毫秒)的時間里,每 10 秒獲取一張,并且命名為 image_number_001_today.jpg,image_number_002_today.jpg… 的形式,并且最后一張照片將命名為 latest.jpg。
raspistill -t 600000 -tl 10000 -o image_num_%03d_today.jpg -l latest.jpg
# 獲取一張照片并發(fā)送至標準輸出設備
raspistill -t 2000 -o -
# 獲取一張照片并保存為一個文件
raspistill -t 2000 -o - > my_file.jpg
#攝像頭一直工作,當按下回車鍵時獲取一張照片。
raspistill -t 0 -k -o my_pics%02d.jpg
? 視頻捕捉
圖像尺寸和預覽設置與圖像捕捉相同。錄制的視頻默認尺寸為 1080p(1920×1080)
# 使用默認設置錄制一段 5 秒鐘的視頻片段(1080p30)
raspivid -t 5000 -o video.h264
# 使用指定碼率(3.5Mbits/s)錄制一段 5 秒鐘的視頻片段
raspivid -t 5000 -o video.h264 -b 3500000
# 使用指定幀率(5fps)錄制一段 5 秒鐘的視頻片段
raspivid -t 5000 -o video.h264 -f 5
# 發(fā)送到標準輸出設備一段 5 秒鐘經(jīng)過編碼的攝像頭流圖像
raspivid -t 5000 -o -
# 保存到文件一段 5 秒鐘經(jīng)過編碼的攝像頭流圖像
raspivid -t 5000 -o - > my_file.h264
6.1.6查看圖片
? 方式一
安裝可以通過終端打開截圖的shotwell。
$sudo apt-get install shotwell
查看圖片命令。
$ sudo shotwell image.jpg
? 方式二
安裝可以通過終端打開截圖的gpicview。
$sudo apt-get install gpicview
查看圖片命令。
$sudo gpicview image.jpg
6.1.7截圖
想在樹莓派上面截圖或截屏用截圖工具scrot 通過命令行就能做到。
1.安裝
在Raspbian上安裝scrot:
命令: sudo apt-get install scrot
2.截屏
截取整個屏幕:scrot (截取圖片的默認名稱通常會有日期時間和分辨率,比如:“2016-10-10-062821_1024x768_scrot.png”)
指定截取圖片的名字:scrot example.png (那么文件名就會叫“example” ,擴展名不要丟,另外改變擴展名也不能改變文件格式)
指定文件位置:scrot /home/pi/Desktop/example.png(截圖文件“example.png”就會被保存在 “/home/pi/Desktop/” ,注意,只有路徑?jīng)]有文件名是不行的)
截取部分圖片:scrot -s 然后拖動要截圖的區(qū)域(scrot -s /home/pi/Desktop/example.png 命名和指定路徑)
? 其他命令參數(shù):
-h 顯示更多幫助
-v 獲取當前版本
-d x 添加X秒的延遲拍攝
-c 添加一個倒計時延遲拍攝
-s 允許用戶用鼠標捕捉特定區(qū)域
-u 捕捉當前活動窗口
-q X 指定圖像質量百分率X(默認75)
-t X 創(chuàng)建一個百分比大小為X的縮略圖
-e 在截圖后指定一個命令來運行
6.1.8視屏播放
? MP4Box
raspivid 通常會將錄制的視頻保存為 .h264 格式的文件。而我們使用的很多播放器可能無法正常播放該格式的視頻文件。這就需要我們將生成的 .h264 格式的文件封裝到播放器能夠識別的視頻容器格式中(比如封裝為 mp4 格式)。有很多視頻處理軟件可以達到這個目的,您也可以直接在 Raspberry Pi 上直接進行封裝。這里介紹的是“gpac”中的“MP4Box”。安裝和使用的方法如下:
$sudo apt-get update
$sudo apt-get install gpac
$sudo MP4Box -add filename.h264 filename.mp4
? Omxplayer
? 播放
$sudo omxplayer –o hdmi 文件名
? 播放控制
Key Action
加速
減速
j 上一條音軌
k 下一條音軌
i 上一節(jié)
o 下一節(jié)
n 上一條字幕軌
m 下一條字幕軌
s 顯示/不顯示字幕
q 退出
空格或p 暫停/繼續(xù)
- 增加音量
左 后退30
右 前進30
上 后退600
下 前進600
6.1.9 擴展閱讀
樹莓派專用CSI攝像頭插到樹莓派的CSI口上并在在raspi-config中打開后就可以使用Raspistill命令直接使用,但如果在OpenCV中調用CSI攝像頭會出現(xiàn)無數(shù)據(jù)的現(xiàn)象(cv2.VideoCapture(0)這時不會報錯)。
這是因為樹莓派中的camera module是放在/boot/目錄中以固件形式加載的,不是一個標準的V4L2的攝像頭驅動,所以加載起來之后會找不到/dev/video0的設備節(jié)點。我們在/etc/modules里面添加一行bcm2835-v4l2(小寫的L)就能解決問題。
$sudo vi /etc/modules
添加:bcm2835-v4l2

6.2樹莓派實現(xiàn)動作捕捉、抓拍并存儲照片
6.2.1開通樹莓派SSH、VNC服務、開通攝像頭
將樹莓派接上鍵盤、鼠標和顯示屏。進入Raspbian系統(tǒng),打開命令行終端,輸入:
$ sudo raspi-config

圖3
當然也可直接在樹莓派上配置。
遠程登錄,默認用戶名:pi, 默認密碼:raspberry
6.2.2 PC機遠程操作樹莓派
使用PC機遠程通過命令行或VNC操作樹莓派要比樹莓派接上鍵盤鼠標,盯著小屏幕看方便很多。具體操作步驟如下:
1)樹莓派接入網(wǎng)絡,在PC終端輸入:(注:Windows下要用PuTTY軟件作為命令行終端,Mac電腦可以直接輸入)
$ ssh pi@樹莓派的IP地址
輸入遠程連接密碼。如果跳到:
pi@raspberrypi:~ $
說明連接成功,你現(xiàn)在可以在pc機上用命令行操作樹莓派了。
2)在pc機上用VNC連接樹莓派。關于SVN的使用請讀者看前面的章節(jié)。
6.2.3安裝動作捕捉腳本
將附件的腳本拷貝到樹莓派的 /home/pi 目錄下創(chuàng)建一個新目錄用來保存抓拍的照片:
$ sudo mkdir picam
然后就可以執(zhí)行腳本了:
$ sudo python picam.py
這時,如果有任何物體在移動,樹莓派的攝像頭就會抓拍,并保存到/home/pi/picam文件夾,在pc機上,就可以遠程用VNC查看這些照片。
【附件】picam.py的代碼
#!/usr/bin/python
# original script by brainflakes, improved by pageauc, peewee2 and Kesthal
# www.raspberrypi.org/phpBB3/viewtopic.php?f=43&t=45235
# You need to install PIL to run this script
# type "sudo apt-get install python-imaging-tk" in an terminal window to do this
import StringIO
import subprocess
import os
import time
from datetime import datetime
from PIL import Image
# Motion detection settings:
# Threshold - how much a pixel has to change by to be marked as "changed"
# Sensitivity - how many changed pixels before capturing an image, needs to be higher if noisy view
# ForceCapture - whether to force an image to be captured every forceCaptureTime seconds, values True or False
# filepath - location of folder to save photos
# filenamePrefix - string that prefixes the file name for easier identification of files.
# diskSpaceToReserve - Delete oldest images to avoid filling disk. How much byte to keep free on disk.
# cameraSettings - "" = no extra settings; "-hf" = Set horizontal flip of image; "-vf" = Set vertical flip; "-hf -vf" = both horizontal and vertical flip
threshold = 10
sensitivity = 20
forceCapture = True
forceCaptureTime = 60 * 60 # Once an hour
filepath = "/home/pi/picam"
filenamePrefix = "capture"
diskSpaceToReserve = 40 * 1024 * 1024 # Keep 40 mb free on disk
cameraSettings = ""
# settings of the photos to save
saveWidth = 1296
saveHeight = 972
saveQuality = 15 # Set jpeg quality (0 to 100)
# Test-Image settings
testWidth = 100
testHeight = 75
# this is the default setting, if the whole image should be scanned for changed pixel
testAreaCount = 1
testBorders = [ [[1,testWidth],[1,testHeight]] ] # [ [[start pixel on left side,end pixel on right side],[start pixel on top side,stop pixel on bottom side]] ]
# testBorders are NOT zero-based, the first pixel is 1 and the last pixel is testWith or testHeight
# with "testBorders", you can define areas, where the script should scan for changed pixel
# for example, if your picture looks like this:
#
# ....XXXX
# ........
# ........
#
# "." is a street or a house, "X" are trees which move arround like crazy when the wind is blowing
# because of the wind in the trees, there will be taken photos all the time. to prevent this, your setting might look like this:
# testAreaCount = 2
# testBorders = [ [[1,50],[1,75]], [[51,100],[26,75]] ] # area y=1 to 25 not scanned in x=51 to 100
# even more complex example
# testAreaCount = 4
# testBorders = [ [[1,39],[1,75]], [[40,67],[43,75]], [[68,85],[48,75]], [[86,100],[41,75]] ]
# in debug mode, a file debug.bmp is written to disk with marked changed pixel an with marked border of scan-area
# debug mode should only be turned on while testing the parameters above
debugMode = False # False or True
# Capture a small test image (for motion detection)
def captureTestImage(settings, width, height):
command = "raspistill %s -w %s -h %s -t 200 -e bmp -n -o -" % (settings, width, height)
imageData = StringIO.StringIO()
imageData.write(subprocess.check_output(command, shell=True))
imageData.seek(0)
im = Image.open(imageData)
buffer = im.load()
imageData.close()
return im, buffer
# Save a full size image to disk
def saveImage(settings, width, height, quality, diskSpaceToReserve):
keepDiskSpaceFree(diskSpaceToReserve)
time = datetime.now()
filename = filepath + "/" + filenamePrefix + "-%04d%02d%02d-%02d%02d%02d.jpg" % (time.year, time.month, time.day, time.hour, time.minute, time.second)
subprocess.call("raspistill %s -w %s -h %s -t 200 -e jpg -q %s -n -o %s" % (settings, width, height, quality, filename), shell=True)
print "Captured %s" % filename
# Keep free space above given level
def keepDiskSpaceFree(bytesToReserve):
if (getFreeSpace() < bytesToReserve):
for filename in sorted(os.listdir(filepath + "/")):
if filename.startswith(filenamePrefix) and filename.endswith(".jpg"):
os.remove(filepath + "/" + filename)
print "Deleted %s/%s to avoid filling disk" % (filepath,filename)
if (getFreeSpace() > bytesToReserve):
return
# Get available disk space
def getFreeSpace():
st = os.statvfs(filepath + "/")
du = st.f_bavail * st.f_frsize
return du
# Get first image
image1, buffer1 = captureTestImage(cameraSettings, testWidth, testHeight)
# Reset last capture time
lastCapture = time.time()
while (True):
# Get comparison image
image2, buffer2 = captureTestImage(cameraSettings, testWidth, testHeight)
# Count changed pixels
changedPixels = 0
takePicture = False
if (debugMode): # in debug mode, save a bitmap-file with marked changed pixels and with visible testarea-borders
debugimage = Image.new("RGB",(testWidth, testHeight))
debugim = debugimage.load()
for z in xrange(0, testAreaCount): # = xrange(0,1) with default-values = z will only have the value of 0 = only one scan-area = whole picture
for x in xrange(testBorders[z][0][0]-1, testBorders[z][0][1]): # = xrange(0,100) with default-values
for y in xrange(testBorders[z][1][0]-1, testBorders[z][1][1]): # = xrange(0,75) with default-values; testBorders are NOT zero-based, buffer1[x,y] are zero-based (0,0 is top left of image, testWidth-1,testHeight-1 is botton right)
if (debugMode):
debugim[x,y] = buffer2[x,y]
if ((x == testBorders[z][0][0]-1) or (x == testBorders[z][0][1]-1) or (y == testBorders[z][1][0]-1) or (y == testBorders[z][1][1]-1)):
# print "Border %s %s" % (x,y)
debugim[x,y] = (0, 0, 255) # in debug mode, mark all border pixel to blue
# Just check green channel as it's the highest quality channel
pixdiff = abs(buffer1[x,y][1] - buffer2[x,y][1])
if pixdiff > threshold:
changedPixels += 1
if (debugMode):
debugim[x,y] = (0, 255, 0) # in debug mode, mark all changed pixel to green
# Save an image if pixels changed
if (changedPixels > sensitivity):
takePicture = True # will shoot the photo later
if ((debugMode == False) and (changedPixels > sensitivity)):
break # break the y loop
if ((debugMode == False) and (changedPixels > sensitivity)):
break # break the x loop
if ((debugMode == False) and (changedPixels > sensitivity)):
break # break the z loop
if (debugMode):
debugimage.save(filepath + "/debug.bmp") # save debug image as bmp
print "debug.bmp saved, %s changed pixel" % changedPixels
# else:
# print "%s changed pixel" % changedPixels
# Check force capture
if forceCapture:
if time.time() - lastCapture > forceCaptureTime:
takePicture = True
if takePicture:
lastCapture = time.time()
saveImage(cameraSettings, saveWidth, saveHeight, saveQuality, diskSpaceToReserve)
# Swap comparison buffers
image1 = image2
buffer1 = buffer2
6.2.4設置腳本開機啟動
在終端上輸入:
$ sudo vi /etc/rc.local
就會出現(xiàn)一個文本編輯器,
在文本內(nèi)容的exit 0 上面添加一行:
$ python /home/pi/picam.py
然后保存更改。
重啟樹莓派:
$ sudo reboot
即可實現(xiàn)開機自動運行。之所以選擇這個腳本是因為它簡潔,有效,而且還能自動清除過期的圖片。相比之下,motion這個軟件就顯得比較復雜。有興趣的同學還可以修改腳本實現(xiàn)抓拍后自動上傳到網(wǎng)盤,或發(fā)送郵件等功能。
##6.3樹莓派+motion 搭建攝像頭監(jiān)控系統(tǒng)
1. 安裝
$sudo apt install motion
2. 配置motion選項
備份配置文件
$sudo cp /etc/motion/motion.conf /etc/motion/motion.conf.bak
打開配置文檔
$sudo vim /etc/motion/motion.conf
更改文檔中以下內(nèi)容
daemon on #開啟守護進程(選配)
target_dir /home/pi/motion-images #圖片保存的路徑
#videodevice /dev/video0 #攝像頭設備(默認)可修改
stream_localhost off #允許通過網(wǎng)頁查看攝像頭
stream_auth_method 2 #開啟密碼認證
stream_authentication 用戶名:密碼 #網(wǎng)頁查看攝像頭的用戶名和密碼
創(chuàng)建一個目錄來存儲Motion拍下的照片
$mkdir ~/motion-images
官方詳細配置說明:http:///foswiki/bin/view/Motion/ConfigFileOptions
3.開啟motion
$ sudo service motion start
$sudo motion
用瀏覽器登陸樹莓派的網(wǎng)址 192.168.3.233:8081 ,會彈出用戶名和密碼的對話框,輸入用戶名和密碼后看到圖像就成功了。需要登錄兩次。

圖4
4. 設置為開機運行(選配)
$sudo vim /etc/rc.local
在exit 0前添加 motion , 保存,就會開機自動運行了。
5. 部分詳細配置選項的翻譯
表1
ffmpeg_duplicate_frames 調試模式,只看到變化的圖像
選項 | Range/Values Default | 說明 |
auto_brightness | Values: on,off
Default: off | 讓motion自動調節(jié)視頻的的亮度,只適用于不帶有自動亮度調節(jié)的攝像機 |
brightness | Values: 0-255
Default: 0 (disabled) | 調整攝像機的亮度 |
saturation | Values: 0 - 255
Default: 0 (disabled) | 調整攝像機的顏色飽和度 |
hue | Values: 0 - 255
Default: 0 (disabled) | 調整攝像機的色調 |
contrast | Values: 0-255
Default: 0 (disabled) | 調整攝像機的對比度 |
daemon | Values: on,off
Default: off | 以守護進程在后臺運行。這個選項只能放在motion.conf,不能放在 thread config file |
emulate_motion | Values: on, off
Default: off | 即使沒有運動物體也要保存圖像 |
ffmpeg_output_movies | Values: on, off
Default: off | 是否保存視頻 |
ffmpeg_bps | Values: 0 - 9999999
Default: 400000 | 視頻比特率 |
ffmpeg_variable_bitrate | Values: 0, 2 -31
Default: 0 (disabled) | 動態(tài)比特率,如果開啟這個功能ffmpeg_bps將被忽略,0為關閉,2為最好質量,31為最差質量 |
Values: on, off
Default: on | 為了達到每秒的幀數(shù)要求,會復制一下幀填充空白時間,關掉這個功能后每個幀都緊接下一個幀,看起來像快進 |
ffmpeg_output_debug_movies | Values: on, off
Default: off | ffmpeg_video_codec | Values:mpeg4, msmpeg4, swf, flv, ffv1, mov, ogg, mp4, mkv, hevc
Default: mpeg4 | 視頻格式 |
framerate | Values: 2 - 100
Default: 100 (no limit) | 幀速率,每秒多少幀 |
frequency | Values: 0 - 999999
Default: 0 (Not set) | 頻率協(xié)調 Hz |
lightswitch | Values: 0 - 100
Default: 0 (disabled) | 忽略光照強度改變引起的變化 |
locate_motion_mode | Values: on, off, preview
Default: off | 給運動物體用方框標出 |
locate_motion_style | Values: box, redbox, cross, redcross
Default: box | 標記風格 |
max_movie_time | Values: 0 (infinite) - 2147483647
Default: 3600 | 最大視頻時間 |
minimum_frame_time | Values: 0 - 2147483647
Default: 0 | 最小幀間隔,設置為0表示采用攝像頭的幀率 |
minimum_motion_frames | Values: 1 - 1000s
Default: 1 | 捕捉持續(xù)至少指定時間的運動幀 |
movie_filename | Values: Max 4095 characters
Default: %v-%Y%m%d%H%M%S | 視頻的文件名 |
ffmpeg_timelapse | Values: 0-2147483647
Default: 0 (disabled) | 間隔時間,拍攝延時視頻 |
ffmpeg_timelapse_mode | Values: hourly, daily, weekly-sunday, weekly-monday, monthly, manual
Default: daily | 延時拍攝模式 |
timelapse_filename | Values: Max 4095 characters
Default: %v-%Y%m%d-timelapse | 延時拍攝的文件名 |
output_pictures | Values: on,off,first,best,center
Default: on | 是否保存圖片和模式設置 |
output_debug_pictures | Values: on,off
Default: off | 圖片調試模式,只輸出運動物體 |
picture_filename | Values: Max 4095 characters
Default: %v-%Y%m%d%H%M%S-%q | 圖片文件名 |
picture_type | Values: jpeg,ppm
Default: jpeg | 圖片類型 |
post_capture | Values: 0 - 2147483647
Default: 0 (disabled) | 運動在持續(xù)多少幀之后才被捕捉 |
pre_capture | Values: 0 - 100s
Default: 0 (disabled) | 輸出圖像包括捕捉到運動的前幾秒 |
quality | Values: 1 - 100
Default: 75 | jpg圖像的質量 |
quiet | Values: on, off
Default: off | 安靜模式,檢測到運動不輸出嗶 |
rotate | Values: 0, 90, 180, 270
Default: 0 (not rotated) | 旋轉圖像角度 |
stream_auth_method | Values: 0,1,2
Default: 0 | 網(wǎng)頁監(jiān)控身份認證方法:0-無,1-基本,2-MD5 |
stream_authentication | Values: username:password
Default: Not defined | 網(wǎng)頁監(jiān)控用戶名和密碼 |
stream_limit | Values: 0 - 2147483647
Default: 0 (unlimited) | 限制幀的數(shù)量 |
stream_localhost | Values: on, off
Default: on | 是否只能本地訪問網(wǎng)絡攝像頭 |
stream_maxrate | Values: 1 - 100
Default: 1 | 限制網(wǎng)絡攝像頭幀速率 |
stream_port | Values: 0 - 65535
Default: 0 (disabled) | 網(wǎng)絡攝像頭端口 |
stream_quality | Values: 1 - 100
Default: 50 | 網(wǎng)絡攝像頭傳輸質量 |
switchfilter | Values: on, off
Default: off | 過濾器開關,過濾器用來區(qū)分真正的運動和噪聲 |
target_dir | Values: Max 4095 characters
Default: Not defined = current working directory | 視頻和圖片的保存路徑 |
videodevice | Values: Max 4095 characters
Default: /dev/video0 | 攝像頭設備名 |
height | Values: Device Dependent
Default: 288 | 圖像高度,范圍跟攝像機相關 |
width | Values: Device Dependent
Default: 352 | 圖像寬度,范圍跟攝像機相關 |
process_id_file | Values: Max 4095 characters
Default: Not defined | 保存PID的文件,推薦/var/run/motion.pid |
database_busy_timeout | Values: 0 .. positive integer
Default: 0 | 數(shù)據(jù)庫等待超時時間,毫秒 |
|