在 R 輸入 WebCam 影像並輸出播放視窗

最近剛好對 Rvision 這個可以連接 openCV 影像偵測函數庫的套件有興趣,但 Rvision 套件對於 WebCam 影像的擷取功能有限,而且 R 軟體上面目前也沒有專門處理相關影音的套件,於是我嘗試搭配 FFmpeg 軟體 (Windows 版),用 R 軟體的 pipe connection 功能來實驗一下在 R  操作影像輸入/輸出的功能

Step 1. 下載 FFmpeg 軟體 Windows 版 , 假設安裝在 d:\Video\FFmpeg 資料夾底下

Step 2. 查看 WebCam 在 Winodws OS 的裝備代號:

在 Windows 開啟命令提示字元(DOS 視窗),輸入以下指令

d:

cd Video/FFmpeg/bin

ffmpeg -list_devices true -f dshow -i dummy

把 output 所顯示的裝備代號記下來,例如 “Webcam D22”

另外,也可以進入 Windows 「控制台」=> 「系統」=> 「裝置管理員」去查看 WebCam 的代號

Step 3. 記得 WebCam 要打開。進入 R 軟體,請將以下程式中 WebCam 代號換成您自己的,並執行程式 :

?View Code LANGUAGE
pipe1 = pipe("d:\\Video\\FFmpeg\\bin\\ffmpeg -f dshow -i video=\"Webcam D22\" -pix_fmt yuv420p -f mpegts - ","rb")
pipe2 = pipe("d:\\Video\\FFmpeg\\bin\\ffplay -analyzeduration 10 -f mpegts - ","wb")
 
# 持續 180 秒
showtime = 180  
 
# 這是每一次從 WebCam 要送到播放視窗的資料大小
# 這個值是我實際從 WebCam 擷取一張圖片,並計算該圖檔的大小
# 這個值可以適度調整
bsize = 13562
 
oldtime = as.numeric(Sys.time())
 
while (as.numeric(Sys.time()) - oldtime < showtime ) {
  bytes = readBin(pipe1,"raw", n=bsize)
  # 中間可以加入影像處理程式
  writeBin(bytes,pipe2)
}
 
close(pipe1)
close(pipe2)

註:

想要更進一步微調影像清晰度的人,可以 Google 搜尋「FFmpeg command line」