日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

5、树莓派连接官方CSI摄像头的使用

發布時間:2023/12/14 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 5、树莓派连接官方CSI摄像头的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本篇博文大部分轉https://blog.csdn.net/u013162035/article/details/78580486

其中有部分細節根據自己的實際操作進行了修改

5.1樹莓派基本操作

? ? ? 目前提供了三個應用程序,分別為:raspistill、raspivid、raspistillyuv。其中 raspistill 和 raspistillyuv 非常相似,并且都是用于捕捉圖像,而 raspivid 用于捕捉視頻。 在樹莓派3B+的樹莓派的 raspberry 2018.04.18 stretch版本的系統中已經自帶raspistill,raspivid這兩個應用程序,另外一個不支持。
? ? ?? 所有應用程序均基于命令行方式運行,通過 OpenMAX 的 mmal API 進行編寫。OpenMAX 的 mmal API 提供了更易使用的系統組件。注意,mmal 是一個由 Broadcom 為 Videocore 4 系統定制的 API。
? ? ?? 應用程序使用了四個 OpenMAX(mmal)組件:camera(攝像)、preview(預覽)、encoder(編碼)、null_sink。所有應用程序均使用了攝像組件,raspistill 使用了圖像編碼組件,raspivid使用了視頻編碼組件,raspistillyuv沒有使用編碼組件,而是直接將 YUV 或 RGB 從攝像組件輸出到文件。
? ? ? 預覽顯示為可選參數,但是可以用于全屏或輸出到指定的顯示器顯示區域進行顯示。如果預覽被禁用,那么 null_silk 組件將會對預覽幀進行“吸收”。這是由于盡管不需要攝像頭生成供顯示所用的的預覽幀,但是仍需要使用它們進行曝光計算和白平衡設置的緣故。
?? 此外,還可以省略文件名參數,這樣既可以直接預覽顯示而不寫入文件,或者直接輸出到標準輸出設備上。命令行幫助可以通過直接輸入應用程序名稱獲得。

5.1.1安裝攝像頭硬件

警告:攝像頭對靜電非常敏感。如果您在安裝攝像頭電路板時沒有防靜電手環,可以嘗試觸摸一下水龍頭、金屬水槽或其它類似的東西即可。
? ?? 攝像頭電路板與 Raspberry Pi 通過一條 15 芯的排線進行連接。僅有兩個連接座需要連接,排線需要安裝到攝像頭電路板和 Raspberry Pi 上。您需要正確安裝,否則攝像頭無法工作。對于攝像頭電路板,排線末端的藍色標記應該背對著電路板。而 Raspberry Pi 部分,藍色標記應該正對著網絡接口方向。?


? ?? 盡管兩部分連接座不盡相同,但它們的工作方式很相似。對于 Raspberry Pi,拉起連接座兩端的卡扣。它應該很容易拉起,并能夠輕微活動。把排線完全插入到連接座中,并保證豎直,然后輕輕按下兩端的卡扣。攝像頭電路板方面,也需要您將卡扣向電路板相反方向拉開,然后輕輕插入排線,最后將卡扣推回。攝像頭電路板的連接座與 Pi 上的區別就在這里。

5.1.2安裝攝像頭軟件

執行下文介紹的命令行進行下載并安裝最新的內核,GPU 固件及應用程序。您需要連接到互聯網才可以實現以下操作。

$sudo apt-get update $sudo apt-get upgrade

? ? ?? 接下來,您首先需要在 Raspberry Pi 的 raspi-config 程序中啟用攝像頭的支持。
1)連接攝像頭與樹莓派
2)修改樹莓派配置,開啟攝像頭模塊。

sudo raspi-config


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

圖2
測試系統已經完成安裝并正常工作,可嘗試以下命令:

$raspistill -v -o test.jpg

? ? ? 這個命令將顯示來自攝像頭 5 秒鐘的預覽圖像,并且拍攝一張照片,然后保存為文件 test.jpg,保存在/home/pi的目錄下面,同時顯示出需要相關信息。

5.1.3通用命令行參數

? 預覽窗口
–preview, -p 預覽窗口設置 <‘x,y,w,h’>
? ? ? 允許用戶在屏幕上定義預覽窗口的大小和位置。注意,這將在所有其它窗口/圖像的上層顯示。
–fullscreen, -f 全屏預覽模式
? ?? 強制預覽屏幕全屏顯示。注意,這將會保留輸入圖像的長寬比例,所以可能會在圖像的邊緣出現填充條。
–nopreview, -n 不顯示預覽窗口
? ? 完全禁用預覽窗口。注意,盡管預覽窗口被禁用,但攝像頭仍然在進行處理,所以會繼續消耗資源。
–opacity, -op 設置預覽窗口透明度
? ? 設置預覽窗口的透明度。0 為完全透明,255 為完全不透明。
? 攝像頭控制參數
–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 打開視頻穩定
????僅用于視頻模式,用于開啟視頻穩定。
–ev, -ev 設置曝光補償
????設置圖像的曝光補償。范圍為 -10 到 10,默認為 0。
–exposure, -ex 設置曝光模式
????可能用到的參數為:
????auto – 使用自動曝光模式
????night – 夜間拍攝模式
????nightpreview -夜間預覽拍攝模式(暫且這么稱呼)
????backlight – 逆光拍攝模式
????spotlight – 聚光燈拍攝模式
????sports – 運動拍攝模式(高速快門等)
????snow – 雪景優化拍攝模式
????beach – 海灘優化拍攝模式
????verylong – 長時間曝光拍攝模式
????fixedfps – 幀約束拍攝模式
????antishake – 防抖模式
????fireworks – 煙火優化拍攝模式
????注意,不是所有的設置都會在對攝像頭進行微調時得到相應作用。
–awb, -awb 設置自動白平衡
????可能用到的參數為:
????off – 關閉白平衡測算
????auto – 自動模式(默認)
????sun – 日光模式
????cloud – 多云模式
????shade – 陰影模式
????tungsten – 鎢燈模式
????fluorescent – 熒光燈模式
????incandescent – 白熾燈模式
????flash – 閃光模式
????horizon – 地平線模式
–imxfx, -ifx 設置圖像特效
????設置應用于圖像上的特效
????可能用到的參數為:
????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 通道的參數(范圍 0 到 255)。例如:–colfx 128:128 將得到一張單色圖像。
?–metering, -mm 設置測光模式
????為預覽和捕捉指定測光模式
????可能用到的參數為:
????average – 全畫面平衡測光
????spot – 點測光
????backlit – 模擬背光圖像
????matrix – 陣列測光
–rotation, -rot 設置圖像旋轉(0 – 359)
對取景器和最終得到的圖像進行旋轉。可以接受 0 以上任何值,但由于硬件限制,只支持 0、90、180、270 度。
????–hflip, -hf 設置水平翻轉
????水平翻轉預覽和保存的圖像。
????–vflip, -vf 設置垂直翻轉
????垂直翻轉預覽和保存的圖像。
????–roi, -roi 設置傳感器感光區域
允許指定用于預覽和捕捉的源所使用的傳感器區域。該功能中 x 和 y 參數指定了坐上角的坐標,以及定義了寬度和高度值,并且所有值都為標準化坐標(0.0 到 1.0)。那么,感光區域設置為橫向和縱向都為一半,并且寬度和高度都為傳感器的四分之一時,可以寫為:
-roi 0.5,0.5,0.25,0.25
–shutter, -ss 設置快門速度
設置快門的速度為指定的值(單位為微秒)。據當前的考證,目前未定義時,快門速度上限大約為 330000us(330ms 或 0.33s)。

5.1.4應用程序專有設置

? raspistill
–width, -w 設置圖像寬度
–height, -h 設置圖像高度
–quality, -q 設置 JPEG 品質,品質為 100 時幾乎等同于未壓縮。75 相對是比較好的選擇。
–raw, -r 向 JPEG 元數據中添加 RAW 信息,該參數將從攝像頭獲取到的 RAW 信息插入到 JPEG 元數據中。
–output, -o 輸出文件名,指定輸出的文件名。如果不指定,將不保存到文件。如果文件名為“-”,將輸出發送至標準輸出設備。
–latest, -l 鏈接最后一幀到文件名,基于該名稱做一個指向最后一幀的文件系統鏈接。
–verbose, -v 在運行過程中輸出詳細信息,在程序運行過程中,輸出調試/詳細信息。
–timeout, -t 獲取圖片前的時間,程序將執行指定的時長,然后進行獲取操作(前提是 output 已指定)。如果未指定,將設置為 5 秒。
–timelapse, -tl 間隔拍攝模式,指定多次拍攝之間所間隔的毫秒值。注意,您需要在文件名中加入 %04d 做為畫面計數。
-t 30000 -tl 2000 -o image%04d.jpg,將會在 30 秒的時間內,每兩秒拍攝一次,并且將文件命名為:image1.jpg、image0002.jpg…image0015.jpg。注意 %04d 表示在文件名中數字部分加入前導零,使其成為 4 位數。例如,%08d 將生成 8 位數字。如果間隔時間設置為 0,程序將不間斷(取決于系統負擔及存儲速度)進行拍攝。不過需要注意,每次捕捉前還是會有 30ms 的最小暫停時間,用于曝光計算操作。
–thumb, -th 設置縮略圖參數(x:y:quality),允許指定插入到 JPEG 文件中縮略圖信息。如果不指定,將為默認的 64×48 質量為 35 的縮略圖。如果設置為 –thumb none,那么將不會向文件中插入縮略圖信息。文件的尺寸也會稍微變小。
–demo, -d 運行演示模式,該參數將循環使用所有攝像頭參數,并且不會捕捉。而且無論是否完成所有的循環,在超時周期到達時都會停止演示操作。循環之前的時間需要設置毫秒值。
–encoding, -e 指定輸出文件的編碼,可用的參數為 jpg、bmp、gif、png。注意,未被硬件加速支持的圖像格式(gif、png、bmp)在保存的時候要比 jpg 格式耗時更長。還需要注意,文件擴展名在編碼時將被完全忽略。
–exif, -x 在捕捉的內容中加入 EXIF 標簽(格式為 ‘key=value’),允許在 JPEG 圖像中插入特定的 EXIF 標簽。您可以插入 32 條記錄。這是非常實用的功能,比如插入 GPS 元數據。例如設置經度。
–exif GPS.GPSLongitude=5/1,10/1,15/100,該命令將會設置經度為 5 度 10 分 15 秒。查看 EXIF 文檔獲得所有可用標簽的詳細信息。支持的標簽如下:
IFD0. 或 IFD1.

$raspivid -o test.h264 -t 25000 -timed 2500,5000

????將進行 25 秒的錄制操作。錄制操作包括若干個 2500 毫秒(2.5 秒)錄制和 5000 毫秒(5秒)暫停的操作,并且重復時長超過 20 秒。所以該錄制過程中實際只錄制了 10 秒的內容。包括 4 段 2.5 秒的視頻片斷 = 被若干個 5 秒鐘暫停操作分隔開的 10 秒鐘視頻。
–keypress, -k 使用回車鍵在錄制和暫停兩種狀態間進行切換,每次點擊回車鍵將會暫停或重新開始錄制進程。點擊 X 鍵后點擊回車鍵將停止錄制并關閉程序。注意,超時設置值將影響錄制結束時間,但僅在每次回車鍵點擊后進行檢查,所以如果系統正在等待按鍵操作,盡管超時設置已過期,錄制進程退出前也會等待按鍵操作。
–signal, -s 使用 SIGUSR1 信號在錄制和暫停兩種狀態間進行切換,向 Raspivid 進程發送 USR1 信號來切換錄制和暫停。該操作可以通過使用 kill 命令來實現。您可以使用“pgrep raspivid” 命令找到 raspivid 的進程 ID。
kill -USR1
【注意】超時設置值將影響錄制結束時間,但僅在每次發送 SIGUSR1 信號后進行檢查,所以如果系統正在等待信號,盡管超時設置已過期,錄制進程退出前也會等待信號的發送操作。
–initial, -i 定義啟動時的初始狀態。定義攝像頭初始狀態為暫停或立即開始錄像。選項可以為“record”(錄像)或“pause”(暫停)。注意,如果您設置的超時時長很短,而且初始狀態設置為“暫停”,那么將不會錄制任何輸出的內容。

–segment, -sg 將視頻流分段存儲到多個文件,與存儲在單個文件中不同,該參數將視頻分段存儲在以毫秒為單位所指定長度的數個文件中。為了將生成的文件命名為不同的名稱,您需要在文件名中合適的位置添加 %04d 或類似的參數來讓文件名中顯示計數值。例如:
–segment 3000 -o video%04d.h264,將分割成每段長度 3000 毫秒(3 秒)并且命名為 video0001.h264,video0002.h264 等。每個段落都是可無縫連接的(段落之間不會丟幀),但每個片段的長度將取決于幀內周期值,原因是每個分割的段落都需要起始于 I-frame 處。因此,每個段落都會等于或大于指定的時間長度。?


–wrap, -wr 設置最大分段數,當輸出分段視頻時,該參數設置了最大分段數,并且達到最大值時,將返回到初始的第一個段落。該參數賦予了錄制分段視頻的功能,但是將覆蓋之前生成的文件。所以,如果設置為4,那么上面的例子中所生成的文件名為 video0001.h264,video0002.h264,video0003.h264,video0004.h264。而且,一旦 video0004.h264 文件錄制完畢后,計數將回到 1,并且 video0001.h264 將被覆蓋。
–start, -sn 設置初始段落數,當輸出分段視頻時,該參數為初始的段落數,它允許從指定的段落恢復之前的錄制操作。默認值為 1。

5.1.5應用示例

? 圖像捕捉
????默認情況下,傳感器將以其支持的最高分辨率進行捕捉。可以在命令行中通過使用 -w 和 -h 參數進行更改。
# 兩秒鐘(時間單位為毫秒)延遲后拍攝一張照片,并保存為 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?


# 強制使預覽窗口出現在坐標為 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
# 獲取一張照片并發送至標準輸出設備
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?


# 發送到標準輸出設備一段 5 秒鐘經過編碼的攝像頭流圖像
raspivid -t 5000 -o -?


# 保存到文件一段 5 秒鐘經過編碼的攝像頭流圖像
raspivid -t 5000 -o - > my_file.h264

6.1.6查看圖片

? 方式一
安裝可以通過終端打開截圖的shotwell。

$sudo apt-get install shotwell
  • 1

查看圖片命令。

$ sudo shotwell image.jpg
  • 1

? 方式二
安裝可以通過終端打開截圖的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/” ,注意,只有路徑沒有文件名是不行的)
截取部分圖片:scrot -s 然后拖動要截圖的區域(scrot -s /home/pi/Desktop/example.png 命名和指定路徑)
? 其他命令參數:
-h 顯示更多幫助
-v 獲取當前版本
-d x 添加X秒的延遲拍攝
-c 添加一個倒計時延遲拍攝
-s 允許用戶用鼠標捕捉特定區域
-u 捕捉當前活動窗口
-q X 指定圖像質量百分率X(默認75)
-t X 創建一個百分比大小為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   上一節
o   下一節
n   上一條字幕軌
m   下一條字幕軌
s   顯示/不顯示字幕
q   退出
空格或p  暫停/繼續
-   減小音量
+   增加音量
左   后退30
右   前進30
上   后退600
下   前進600

5.1.9 擴展閱讀

? 樹莓派專用CSI攝像頭插到樹莓派的CSI口上并在在raspi-config中打開后就可以使用Raspistill命令直接使用,但如果在OpenCV中調用CSI攝像頭會出現無數據的現象(cv2.VideoCapture(0)這時不會報錯)。
這是因為樹莓派中的camera module是放在/boot/目錄中以固件形式加載的,不是一個標準的V4L2的攝像頭驅動,所以加載起來之后會找不到/dev/video0的設備節點。我們在/etc/modules里面添加一行bcm2835-v4l2(小寫的L)就能解決問題。

$sudo vi /etc/modules
  • 添加:bcm2835-v4l2

6.2樹莓派實現動作捕捉、抓拍并存儲照片

6.2.1開通樹莓派SSH、VNC服務、開通攝像頭

將樹莓派接上鍵盤、鼠標和顯示屏。進入Raspbian系統,打開命令行終端,輸入:

$ sudo raspi-config
  • 1


圖3
當然也可直接在樹莓派上配置。
遠程登錄,默認用戶名:pi, 默認密碼:raspberry

6.2.2 PC機遠程操作樹莓派

使用PC機遠程通過命令行或VNC操作樹莓派要比樹莓派接上鍵盤鼠標,盯著小屏幕看方便很多。具體操作步驟如下:
1)樹莓派接入網絡,在PC終端輸入:(注:Windows下要用PuTTY軟件作為命令行終端,Mac電腦可以直接輸入)

$ ssh pi@樹莓派的IP地址
  • 1

輸入遠程連接密碼。如果跳到:
pi@raspberrypi:~ $
說明連接成功,你現在可以在pc機上用命令行操作樹莓派了。
2)在pc機上用VNC連接樹莓派。關于SVN的使用請讀者看前面的章節。

6.2.3安裝動作捕捉腳本

將附件的腳本拷貝到樹莓派的 /home/pi 目錄下創建一個新目錄用來保存抓拍的照片:

$ sudo mkdir picam

然后就可以執行腳本了:

$ 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 thisimport 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_frsizereturn du# Get first image image1, buffer1 = captureTestImage(cameraSettings, testWidth, testHeight)# Reset last capture time lastCapture = time.time()while (True):# Get comparison imageimage2, buffer2 = captureTestImage(cameraSettings, testWidth, testHeight)# Count changed pixelschangedPixels = 0takePicture = Falseif (debugMode): # in debug mode, save a bitmap-file with marked changed pixels and with visible testarea-bordersdebugimage = 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 picturefor x in xrange(testBorders[z][0][0]-1, testBorders[z][0][1]): # = xrange(0,100) with default-valuesfor 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 channelpixdiff = abs(buffer1[x,y][1] - buffer2[x,y][1])if pixdiff > threshold:changedPixels += 1if (debugMode):debugim[x,y] = (0, 255, 0) # in debug mode, mark all changed pixel to green# Save an image if pixels changedif (changedPixels > sensitivity):takePicture = True # will shoot the photo laterif ((debugMode == False) and (changedPixels > sensitivity)):break # break the y loopif ((debugMode == False) and (changedPixels > sensitivity)):break # break the x loopif ((debugMode == False) and (changedPixels > sensitivity)):break # break the z loopif (debugMode):debugimage.save(filepath + "/debug.bmp") # save debug image as bmpprint "debug.bmp saved, %s changed pixel" % changedPixels# else:# print "%s changed pixel" % changedPixels# Check force captureif forceCapture:if time.time() - lastCapture > forceCaptureTime:takePicture = Trueif takePicture:lastCapture = time.time()saveImage(cameraSettings, saveWidth, saveHeight, saveQuality, diskSpaceToReserve)# Swap comparison buffersimage1 = image2buffer1 = buffer2

6.2.4設置腳本開機啟動

在終端上輸入:

$ sudo vi /etc/rc.local

就會出現一個文本編輯器,
在文本內容的exit 0 上面添加一行:

$ python /home/pi/picam.py

然后保存更改。
重啟樹莓派:

$ sudo reboot

?? 即可實現開機自動運行。之所以選擇這個腳本是因為它簡潔,有效,而且還能自動清除過期的圖片。相比之下,motion這個軟件就顯得比較復雜。有興趣的同學還可以修改腳本實現抓拍后自動上傳到網盤,或發送郵件等功能。

5.3樹莓派+motion 搭建攝像頭監控系統

1. 安裝

$sudo apt install motion

2. 配置motion選項
備份配置文件

$sudo cp /etc/motion/motion.conf /etc/motion/motion.conf.bak

打開配置文檔

$sudo vim /etc/motion/motion.conf

更改文檔中以下內容

daemon on #開啟守護進程(選配) target_dir /home/pi/motion-images #圖片保存的路徑 #videodevice /dev/video0 #攝像頭設備(默認)可修改 stream_localhost off #允許通過網頁查看攝像頭 stream_auth_method 2 #開啟密碼認證 stream_authentication 用戶名:密碼 #網頁查看攝像頭的用戶名和密碼

創建一個目錄來存儲Motion拍下的照片

$mkdir ~/motion-images

官方詳細配置說明:http://lavrsen.dk/foswiki/bin/view/Motion/ConfigFileOptions
3.開啟motion

$ sudo service motion start $sudo motion

? ?? 用瀏覽器登陸樹莓派的網址 192.168.8.105:8081 ,會彈出用戶名和密碼的對話框,輸入用戶名和密碼后看到圖像就成功了。需要登錄兩次。


圖4
4. 設置為開機運行(選配)

$sudo vim /etc/rc.local

在exit 0前添加 motion , 保存,就會開機自動運行了。
5. 部分詳細配置選項的翻譯

表1

ffmpeg_duplicate_frames 調試模式,只看到變化的圖像
選項Range/Values Default說明
auto_brightnessValues: on,off Default: off讓motion自動調節視頻的的亮度,只適用于不帶有自動亮度調節的攝像機
brightnessValues: 0-255 Default: 0 (disabled)調整攝像機的亮度
saturationValues: 0 - 255 Default: 0 (disabled)調整攝像機的顏色飽和度
hueValues: 0 - 255 Default: 0 (disabled)調整攝像機的色調
contrastValues: 0-255 Default: 0 (disabled)調整攝像機的對比度
daemonValues: on,off Default: off以守護進程在后臺運行。這個選項只能放在motion.conf,不能放在 thread config file
emulate_motionValues: on, off Default: off即使沒有運動物體也要保存圖像
ffmpeg_output_moviesValues: on, off Default: off是否保存視頻
ffmpeg_bpsValues: 0 - 9999999 Default: 400000視頻比特率
ffmpeg_variable_bitrateValues: 0, 2 -31 Default: 0 (disabled)動態比特率,如果開啟這個功能ffmpeg_bps將被忽略,0為關閉,2為最好質量,31為最差質量
Values: on, off Default: on為了達到每秒的幀數要求,會復制一下幀填充空白時間,關掉這個功能后每個幀都緊接下一個幀,看起來像快進
ffmpeg_output_debug_moviesValues: on, off Default: off
ffmpeg_video_codecValues:mpeg4, msmpeg4, swf, flv, ffv1, mov, ogg, mp4, mkv, hevc Default: mpeg4視頻格式
framerateValues: 2 - 100 Default: 100 (no limit)幀速率,每秒多少幀
frequencyValues: 0 - 999999 Default: 0 (Not set)頻率協調 Hz
lightswitchValues: 0 - 100 Default: 0 (disabled)忽略光照強度改變引起的變化
locate_motion_modeValues: on, off, preview Default: off給運動物體用方框標出
locate_motion_styleValues: box, redbox, cross, redcross Default: box標記風格
max_movie_timeValues: 0 (infinite) - 2147483647 Default: 3600最大視頻時間
minimum_frame_timeValues: 0 - 2147483647 Default: 0最小幀間隔,設置為0表示采用攝像頭的幀率
minimum_motion_framesValues: 1 - 1000s Default: 1捕捉持續至少指定時間的運動幀
movie_filenameValues: Max 4095 characters Default: %v-%Y%m%d%H%M%S視頻的文件名
ffmpeg_timelapseValues: 0-2147483647 Default: 0 (disabled)間隔時間,拍攝延時視頻
ffmpeg_timelapse_modeValues: hourly, daily, weekly-sunday, weekly-monday, monthly, manual Default: daily延時拍攝模式
timelapse_filenameValues: Max 4095 characters Default: %v-%Y%m%d-timelapse延時拍攝的文件名
output_picturesValues: on,off,first,best,center Default: on是否保存圖片和模式設置
output_debug_picturesValues: on,off Default: off圖片調試模式,只輸出運動物體
picture_filenameValues: Max 4095 characters Default: %v-%Y%m%d%H%M%S-%q圖片文件名
picture_typeValues: jpeg,ppm Default: jpeg圖片類型
post_captureValues: 0 - 2147483647 Default: 0 (disabled)運動在持續多少幀之后才被捕捉
pre_captureValues: 0 - 100s Default: 0 (disabled)輸出圖像包括捕捉到運動的前幾秒
qualityValues: 1 - 100 Default: 75jpg圖像的質量
quietValues: on, off Default: off安靜模式,檢測到運動不輸出嗶
rotateValues: 0, 90, 180, 270 Default: 0 (not rotated)旋轉圖像角度
stream_auth_methodValues: 0,1,2 Default: 0網頁監控身份認證方法:0-無,1-基本,2-MD5
stream_authenticationValues: username:password Default: Not defined網頁監控用戶名和密碼
stream_limitValues: 0 - 2147483647 Default: 0 (unlimited)限制幀的數量
stream_localhostValues: on, off Default: on是否只能本地訪問網絡攝像頭
stream_maxrateValues: 1 - 100 Default: 1限制網絡攝像頭幀速率
stream_portValues: 0 - 65535 Default: 0 (disabled)網絡攝像頭端口
stream_qualityValues: 1 - 100 Default: 50網絡攝像頭傳輸質量
switchfilterValues: on, off Default: off過濾器開關,過濾器用來區分真正的運動和噪聲
target_dirValues: Max 4095 characters Default: Not defined = current working directory視頻和圖片的保存路徑
videodeviceValues: Max 4095 characters Default: /dev/video0攝像頭設備名
heightValues: Device Dependent Default: 288圖像高度,范圍跟攝像機相關
widthValues: Device Dependent Default: 352圖像寬度,范圍跟攝像機相關
process_id_fileValues: Max 4095 characters Default: Not defined保存PID的文件,推薦/var/run/motion.pid
database_busy_timeoutValues: 0 .. positive integer Default: 0數據庫等待超時時間,毫秒

總結

以上是生活随笔為你收集整理的5、树莓派连接官方CSI摄像头的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。