[問題] OpenCV4Android做即時影像背景相減的問題

作者: ab790815 (CheeseMoon)   2015-12-09 23:34:14
小弟是程設新手
最近對影像處理感興趣所以摸摸看
現在想要做一個用手機鏡頭的即時影像做背景相減
檢測差異處的程式
我參考 Opencv for Android 的第一個範例程式
內容主要是介紹 OpenCV 的 Camera 功能
這個範例裡面用下面這個函式載入鏡頭取得的影像以及return到手機畫面
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
return inputFrame.rgba();
}
因為背景相減要兩張影像
所以我嘗試在這裡擷取前後幀影像
我用的方法是把上面的函式當作無窮迴圈
讀入第一張畫面之後先暫存
讀第二張影像之後再把第一張影像拿出來比對
而暫存的那張影像
理論上是一張不會動的影像
但我發現他還是會持續被更新
導致會跟第二張影像一模一樣
我覺得問題可能是出在 inputFrame
好像不能直接從這裡撈單張影像
我有查過資料
inputFrame 似乎是串流影像
不知道是不是因為這樣
所以我暫存的影像實際上是變成了影片片段
我有試過輸出暫存的影像(有設條件只存一次)
但輸出的影像還是會跟著鏡頭動
作者: soheadsome (師大狗鼻哥)   2015-12-09 23:57:00
感覺是因為.rgba()會回傳某東西的參考參考的東西在更新 你拿到的東西也會更新
作者: ab790815 (CheeseMoon)   2015-12-10 00:11:00
inputFrame.rgba()會變成Mat格式 rgba()只是以彩色輸出另外還有.gray() 以灰階輸出
作者: VSei (Chaos)   2015-12-10 08:16:00
設一個條件只存第三張影像然後show出來,其他不要,試試看。stream是很多張單張影像連續撥放(經由buffer),跟stream無關函數已經return單張的image出來,要留住它需複製一份另外放這個我做過,沒程式碼沒辦法幫忙更多,加油
作者: ab790815 (CheeseMoon)   2015-12-10 09:01:00
我測試的方式是宣告一個全域 Mat 跟用來計數的全域int計數器加在這個funtion裡面每run一次就++我設條件計數器等於1的時候將第1幀影像存到 Mat然後把這個影像輸出到畫面理論上只會存一張影像且輸出的畫面是不會動的但結果是畫面還是會跟著鏡頭動我參考這個網站做的東西http://python.jobbole.com/81593/可是我取得的基底背景會不斷被更新以至於會跟後面抓的影像一模一樣
作者: VSei (Chaos)   2015-12-10 10:27:00
如果可以的話請您將程式碼張貼網站,方便大家幫忙debug如果不方便請用ptt私信code,也許比較能幫忙,謝謝。
作者: z0furu (阿兩)   2015-12-10 13:13:00
請問樓主的範例是去哪看的?最近也有這個需求需要研究
作者: ab790815 (CheeseMoon)   2015-12-10 21:56:00
To VSei:我找到解決辦法了,但原本的問題原因還是無解。因為程式碼被我改來改去,我正在還原原本錯誤的程式等我改好再跟你討論 感謝!!To z0furu : 我參考的是OpenCV官方4android的範例他第一個範例只是介紹怎麼用Camera而已不知道您的需求是怎樣的功能?這是我節錄比較重點部分的codehttp://pastebin.com/sS9JXrNv我希望印出一個不會動的影像,但結果是影像會一直被更新
作者: chenhaoftk (鼻血海)   2015-12-11 00:29:00
Camera=inputFrame.gray().clone()?
作者: ab790815 (CheeseMoon)   2015-12-11 00:53:00
.clone() 好像只是複製框架,並沒有複製內容的樣子。
作者: VSei (Chaos)   2015-12-11 14:39:00
嗯,做出來了,code你參考看看。做一個menu(或button也可以),去觸發count畫面上開一個txtview去看count是否有正確運作再弄一個ImageView先顯示一張圖,count觸發條件時,改變影像就會知道camera是否有抓到值可以回傳或是沒抓到JavaCameraView會一直抓inputFrame.rgba()顯示單張圖在ImageView可能在BaseLoaderCallback沒執行作用OpenCVLoader.initAsync不需要一直load,初始化
作者: Cycylno (君)   2015-12-11 19:22:00
之前有碰過一點OpenCV,它的Mat基本上都是用參考的方式所以你的影像才會一直連動。看官方的documentation是說.clone()會複製出一份新的,可是實際使用OpenCV4Android就是跟C++版不一樣...感覺為了要在Android上運行,他們硬幹了很多東西...
作者: VSei (Chaos)   2015-12-11 22:01:00
private Mat once = new Mat(); --> create一個新區域去放https://youtu.be/kivphxEL_m0

Links booklink

Contact Us: admin [ a t ] ucptt.com