2019年2月22日 星期五

個人資料(Profile)

陳士農(Shih-Nung Chen)
    副教授兼系主任(Associate Professor and Chairman)
    亞洲大學資訊傳播學系(Department of Information Communication, Asia University)
    E-mail: nung@asia.edu.tw
    Tel: +886-4-23323456#6162

專長(Areas of Interest)
    電腦模擬(Computer Simulation)
    分散式系統(Distributed System)
    生物資訊(Bioinformatics)
    影像處理(Image Processing)


2019年2月13日 星期三

用 Python 剪輯影片

先用 Python 寫支程式到 YouTube 下載李飛飛 TED 演講的影片(How we teach computers to understand pictures)。將下載的影片命名為 Video.mp4 (影片解析度為 1280x720,長度為 18:02),並儲存於工作目錄。


安裝 ffmpeg 套件 (此時版本為 4.1)

    conda install ffmpeg -c conda-forge

安裝 moviepy 套件 (此時版本為 0.2.3.5)

    pip install moviepy

第一版程式-使用 ffmpeg_extract_subclip 剪輯

    from moviepy.video.io.ffmpeg_tools import ffmpeg_extract_subclip

    t1 = 50
    t2 = 100
    ffmpeg_extract_subclip('C:\Temp\Video.mp4', t1, t2, targetname='C:\Temp\Video Clip 1.mp4')

    t1 = 100
    t2 = 150
    ffmpeg_extract_subclip('C:\Temp\Video.mp4', t1, t2, targetname='C:\Temp\Video Clip 2.mp4')

程式執行後會將下載的 Video.mp4 剪輯出 Video Clip 1.mp4 (50s-100s) 與 Video Clip 2.mp4 (100s-150s) 兩段影片。

Video Clip 1.mp4 (50s-100s)


Video Clip 2.mp4 (100s-150s)


**********************************************************************************************************************

第二版程式-使用 VideoFileClip 剪輯

    from moviepy.video.io.VideoFileClip import VideoFileClip

    t1 = 50
    t2 = 100
    input_video = 'C:\Temp\Video.mp4'
    output_video = 'C:\Temp\Video Clip 1.mp4'
    with VideoFileClip(input_video) as video:
        video_clip = video.subclip(t1, t2)
        video_clip.write_videofile(output_video, audio_codec='aac')

    t1 = 100
    t2 = 150
    input_video = 'C:\Temp\Video.mp4'
    output_video = 'C:\Temp\Video Clip 2.mp4'
    with VideoFileClip(input_video) as video:
        video_clip = video.subclip(t1, t2)
        video_clip.write_videofile(output_video, audio_codec='aac')

程式執行後一樣會將下載的 Video.mp4 剪輯出 Video Clip 1.mp4 (50s-100s) 與 Video Clip 2.mp4 (100s-150s) 兩段影片。

Video Clip 1.mp4 (50s-100s)


Video Clip 2.mp4 (100s-150s)


從畫面截圖可以看出兩個版本的程式會有些微的時間差。仔細比對,第二版的程式時間比較準;可是第一版的執行速度非常快。

**********************************************************************************************************************

有時候只是想聽演講內容,而不需要畫面,這時用 mp3 會方便很多。

第三版程式-使用 ffmpeg_extract_audio 擷取聲音

    from moviepy.video.io.ffmpeg_tools import ffmpeg_extract_audio
    ffmpeg_extract_audio('C:\Temp\Video.mp4', 'C:\Temp\Audio.mp3', bitrate=3000, fps=44100)

**********************************************************************************************************************

第四版程式-使用 AudioFileClip 擷取聲音

    from moviepy.audio.io.AudioFileClip import AudioFileClip
    audio_clip = AudioFileClip('C:\Temp\Video.mp4')
    audio_clip.write_audiofile('C:\Temp\Audio.mp3')
    # 預設 fps=44100,bitrate='3000k'

原始長度為 18:02 的影片,在相同的 bit rate 與 fps 下,第三版的程式擷取出來的聲音檔長度為 18:02,與影片長度一致;但第四版的程式擷取出來的聲音檔長度卻為 18:30,還好聲音聽起來感覺不出延遲。

**********************************************************************************************************************

第五版程式-使用 concatenate_videoclips 串接影片

    from moviepy.editor import VideoFileClip, concatenate_videoclips
    clip1 = VideoFileClip('C:\Temp\Video.mp4').subclip(50, 100)
    clip2 = VideoFileClip('C:\Temp\Video.mp4').subclip(100, 150)
    final_clip = concatenate_videoclips([clip1, clip2])
    final_clip.write_videofile('C:\Temp\Video Clip.mp4')
    # 如未指定 write_videofile 的 audio_codec 參數,預設是 mp3

程式執行後會將 Video.mp4 (50s-100s) 與 Video.mp4 (100s-150s) 兩段影片串接成 Video Clip.mp4 (0s-100s)。

Video Clip.mp4 (0s)


Video Clip.mp4 (50s)


**********************************************************************************************************************

第六版程式-使用 clips_array 與 vfx 堆疊特效影片

    from moviepy.editor import VideoFileClip, clips_array, vfx
    clip1 = VideoFileClip('C:\Temp\Video.mp4').subclip(50, 100).margin(10)
    clip2 = clip1.fx(vfx.mirror_x)
    clip3 = clip1.fx(vfx.mirror_y)
    clip4 = clip1.resize(0.60)
    final_clip = clips_array([[clip1, clip2], [clip3, clip4]])
    final_clip.resize(width=1280).write_videofile('C:\Temp\Video vfx Clip.mp4')
    # clip1 增加 10 個像素的黑邊,clip2 對 x 軸鏡射,clip3 對 y 軸鏡射,clip4 縮小 60%
    # 調整輸出影片解析度寬為 1280

程式執行後會將 Video.mp4 (50s-100s) 影片經過四次 vfx 特效處理後,堆疊成 Video vfx Clip.mp4 (0s-50s)。

Video vfx Clip.mp4 (0s-50s)


堆疊影片的速度會隨著所做的特效而變慢非常多,如果不調整輸出影片解析度,堆疊後的影片解析度會變成 2600x1480 (寬與高要加上多出來的黑邊)。

**********************************************************************************************************************

第七版程式-製作 GIF 影片

    from moviepy.editor import VideoFileClip
    clip = VideoFileClip('C:\Temp\Video.mp4').subclip(50, 52)
    final_clip = clip.resize(0.50)
    final_clip.write_gif('C:\Temp\Video Clip.gif')

Video Clip.gif


**********************************************************************************************************************

在各個程式版本之間,我故意使用不同的語法與應用方式,做測試也留下筆記,尤其是在第二版中使用了 with-as statement。為了處理檔案讀取過程中發生的例外,並且確定最後檔案一定會關閉,一般會使用 try-except-finally statement,而在 Python 3 (或 2.6) 中,可以使用 wit-as statement 來簡化程式的撰寫。

使用 try-except-finally statement

    from moviepy.video.io.VideoFileClip import VideoFileClip
    t1 = 50
    t2 = 100
    input_video = 'C:\Temp\Video.mp4'
    output_video = 'C:\Temp\Video Clip 1.mp4'
    video = VideoFileClip(input_video)
    try:
        video_clip = video.subclip(t1, t2)
        video_clip.write_videofile(output_video, audio_codec='aac')
    except:
        print('讀取檔案發生錯誤')
    finally:
        video.close()

使用 wit-as statement

    from moviepy.video.io.VideoFileClip import VideoFileClip
    t1 = 50
    t2 = 100
    input_video = 'C:\Temp\Video.mp4'
    output_video = 'C:\Temp\Video Clip 1.mp4'
    with VideoFileClip(input_video) as video:
        video_clip = video.subclip(t1, t2)
        video_clip.write_videofile(output_video, audio_codec='aac')

with 之後的運算式傳回的物件,可以使用 as 指定給變數來參考,在上面的例子中,video 所參考到的物件,最後會被自動關閉,即使在 with-as 的區塊中發生了例外,最後還是一定會關閉 video 所參考的物件。

2019年2月11日 星期一

Lottie Lemon (Arduino Robot System)

之前上課都是以 Android 手機 + LEGO MINDSTORMS NXT 2.0 或 Arduino + 各種感應器為主,反倒這部 Lottie Lemon 一直被冰著,下次讓它出場。

Lottie Lemon 正面


Lottie Lemon 側面


Lottie Lemon Figure Hardware Top (Control Board)


Control Board Summary


Lottie Lemon Figure Hardware Bottom (Motor Board)


Lottie Lemon Figure Hardware Bottom (Motor Board) Back


Motor Board Summary


2019年2月2日 星期六

EPSON Moverio BT-300 AR 實作

EPSON Moverio BT-300 雙眼穿透式智慧型眼鏡


以 Android 為基礎,搭配 Intel Atom x5 1.44GHz 四核心 CPU 與智慧型動作追蹤感應器、OLED 顯示器、Wi-Fi、藍牙,最高 6 小時的電池電力。感測器則有 GPS、地磁感測器、加速度計感測器、陀螺儀感測器、光源感測器,可暫時滿足人們期望的擴增實境體驗。

智慧型眼鏡本體


OLED 顯示器


前置 5 百萬畫素攝影機


配戴視野


控制器


聲音需要另接耳機聆聽,隨包裝附的是有音量調節按鍵(+/-)的耳道式耳機 。


EPSON Moverio BT-300 規格



**********************************************************************************************************************

接著以 EPSON Moverio BT-300 來實作 AR 應用,首先開啟 AR 與 Unity 網誌開發的專案。


選擇「Window / Asset Store」登入 Unity Asset Store


選擇「Import」My Assets 裡的 Moverio BT-300 Unity Plugin (如果沒有此 Plugin,先至 Unity Asset Store 購買,它是免費的)


點擊「Import」


將 EPSON Moverio BT-300 用 USB 線連接至電腦,點擊「Build And Run」。


戴上 EPSON Moverio BT-300 將攝影機視線對準 Image Target 即可產生 AR 效果,很可惜 EPSON Moverio BT-300 的圖形運算能力不好,同樣的模型它只能顯示部分的破碎模型。

新一代的 EPSON Moverio BT-300 雖然進步了很多,但我覺得最大的問題還是那有線的控制器。一來是行動上不方便,加上外接式的耳道式耳機又更是累贅。二來是控制器同時設計了十字方向鍵/輸入鍵,以及觸控板。使用說明書說,十字方向鍵是一種靜電觸控感測器,即使再輕的觸碰也能做出回應,但我實際使用卻非常難用。然後除了十字方向鍵的靜電觸控感測器,又設計了觸控板,真的很多餘。兩種操作方式合在一起,偏偏變得很難用,還不如全都用實體按鍵,或是單一觸控裝置。

在 AR 的效果上,因為採用的是雙眼穿透式眼鏡,以至於左右鏡片上的 OLED 顯示器,在視覺上就是眼前有一片浮空螢幕,AR 的隔離感很重。而且前置 5 百萬畫素攝影機解析度不足,只有一個,位置又在右邊鏡架彎角處,成像的視角是單邊又偏移的,無法達成光學實景與視訊畫面完美的融合,非常可惜。最後,它對眼鏡族來說,還是非常不友善。

2019年1月31日 星期四

AR VR MR

Azuma [1] 將擴增實境(Augmented Reality,AR)定義為是一種虛擬實境(Virtual Reality,VR)的變化,虛擬實境旨在讓使用者完全的融入電腦所創造出的虛擬環境中,當使用者在虛擬實境中,無法看到其週遭的現實環境;然而擴增實境可以讓使用者看到現實環境以及重疊在現實環境中的虛擬物體,因此,擴增實境是增進了現實,而不是完全的取代現實,其研究中,提出擴增實境有三項必需的屬性:一是結合真實與虛擬、二是即時性的互動、三是必需在三度空間內。

Milgram [2] 則將現實環境與虛擬環境視為一封閉的集合,如圖所示,圖的左邊代表純粹的現實環境,而圖的右邊代表純粹的虛擬環境,那麼在兩端點間的區域則表示現實環境與虛擬環境中的物件同時的呈現,並以混合真實(Mixed Reality, MR)類別來表示這個區域。因此可以了解擴增實境是被歸類在現實與虛擬之間,屬於混合真實類別下的一個類別。


擴增實境是虛擬實境技術的延伸。如果將環境的構成分成場景與存在物兩種元素,虛擬實境的場景與存在物都是虛擬的,而擴增實境利用電腦演算將虛擬的物件繪製在真實空間中,讓虛擬物件融入生活場景裡。擴增實境是利用對符號的辨識,將每一個符號所定義的虛擬物件疊加在真實環境中的符號上,並且隨著觀看者的角度改變虛擬物件所呈現的狀態,達到人的自然視覺感受。如圖所示,Vlahakis [3] 利用擴增實境技術提供古蹟的虛擬影像,將虛擬建築疊加在古蹟的原址上。





[1] Azuma, R., A Survey of Augmented Reality. Presence: Teleoperators and Virtual Environments, pp. 355-385, 1997.
[2] Milgram, P., Takemura, H., Utsumi A., and Kishino F., Augmented Reality: A Class of Displays on the Reality-Virtuality Continuum. SPIE Vol. 2351-34, Telemanipulator and Telepresence Technologies, 1994.
[3] Vlahakis, V. et al., Archeoguide: First Results of an Augmented Reality, Mobile Computing System in Cultural Heritage Sites, Proceedings of the 2001 Conference on Virtual Reality, Archeology, and Cultural Heritage, pp. 131-140, 2001.

2019年1月30日 星期三

AR 與 Unity

登入 Vuforia Developer Portal (https://developer.vuforia.com/vui/auth/login),在 License Manager 頁面建立一個 Development License Key。


複製 Development License Key 以便使用


在 Target Manager 頁面建立一個 Database


選擇一張圖片做為 Image Target (AR Marker)


新增一個 Image Target


勾選要使用的 Image Target,點擊「Download Database」。


點選 Unity Editor,點擊「Download」。


瀏覽器將會下載 HelloAR.unitypackage

**********************************************************************************************************************

Unity 的更新速度很快,而且常常新版的又會改變原來的功能名稱或操作方式,以下以 Unity 2018.3.3f1 為例。

Unity 安裝時要勾選 Vuforia Agumented Reality Support;如果要發佈到其他平台,也必須勾選對應的平台支援元件,這範例預計再發佈到 Android 平台,所以也必須勾選 Android Build Support,然後點擊「Next」。


新增專案名稱 HelloAR,點擊「Create Project」。


選擇「Assets / Import Package / Custom Package...」匯入下載的 HelloAR.unitypackage。


點擊「Import」


刪除 Hierarchy 視窗中的 Main Camera,此預設攝影機不具備 AR 功能。


選擇「Edit / Project Settings...」


勾選「Player / Vuforia Augmented Reality Supported」


選擇「GameObject / Vuforia Engine / AR Camera」


點擊「Import」


選擇 Hierarchy 視窗中的 AR Camera,然後點擊 Inspector 視窗中的「 Open Vuforia Engine Configuration」。


在 Inspector 視窗中貼上之前複製的 Development License Key


選擇「GameObject / Vuforia Engine / Image」


調整 Iamge Target 的位置與大小


選擇「Assets / Import New Asset...」可匯入 FBX 模型


選擇「Window / Asset Store」可登入 Unity Asset Store,以下以 Unity Asset Store 為例。


選擇「Import」My Assets 裡的 Optimize, SD Kohaku-Chanz! 模型(如果沒有此模型,先至 Unity Asset Store 購買,它是免費的)


點擊「Import」


選擇 Project 視窗中的「Assets / Optimize SD Kohaku-Chanz / Prefab / UTC_Default」模型


拖曳至 Image Target 下


切換至 Scene,調整模型的位置與大小。


點擊「Play」,將攝影機對準 Image Target 即可產生 AR 效果。


**********************************************************************************************************************

要發佈到 Android 平台,必須先安裝 Android Studio 開發環境(此時版本為 3.3)。

選擇「File / Build Settings...」


選擇 Platform 選單中的 Android,然後點擊「Switch Platform」。


改變發佈平台後,點擊「Player Settings...」。


勾選 Inspector 視窗中的「XR Settings / Vuforia Augmented Reality Supported」


在 Inspector 視窗中的「Other Settings / Package Name」填入 com.nung.helloar


取消勾選 Inspector 視窗中的「Other Settings / Android TV Compatibility」


將 Android 手機或平板用 USB 線連接至電腦,點擊「Build And Run」。


發佈時,可修改檔案要儲存的位置與檔案名稱,然後點擊「存檔」。


發佈完成


將手機對準 Image Target 即可產生 AR 效果