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

看板AndroidDev作者 (CheeseMoon)時間8年前 (2015/12/09 23:34), 8年前編輯推噓7(7044)
留言51則, 6人參與, 最新討論串1/1
小弟是程設新手 最近對影像處理感興趣所以摸摸看 現在想要做一個用手機鏡頭的即時影像做背景相減 檢測差異處的程式 我參考 Opencv for Android 的第一個範例程式 內容主要是介紹 OpenCV 的 Camera 功能 這個範例裡面用下面這個函式載入鏡頭取得的影像以及return到手機畫面 public Mat onCameraFrame(CvCameraViewFrame inputFrame) { return inputFrame.rgba(); } 因為背景相減要兩張影像 所以我嘗試在這裡擷取前後幀影像 我用的方法是把上面的函式當作無窮迴圈 讀入第一張畫面之後先暫存 讀第二張影像之後再把第一張影像拿出來比對 而暫存的那張影像 理論上是一張不會動的影像 但我發現他還是會持續被更新 導致會跟第二張影像一模一樣 我覺得問題可能是出在 inputFrame 好像不能直接從這裡撈單張影像 我有查過資料 inputFrame 似乎是串流影像 不知道是不是因為這樣 所以我暫存的影像實際上是變成了影片片段 我有試過輸出暫存的影像(有設條件只存一次) 但輸出的影像還是會跟著鏡頭動 -------------------------------------------- 因為學淺不懂原理 煩請各位高手幫幫忙 如果問題敘述哪邊看不懂我可以在補充 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.255.185.226 ※ 文章網址: https://www.ptt.cc/bbs/AndroidDev/M.1449675257.A.216.html

12/09 23:57, , 1F
感覺是因為.rgba()會回傳某東西的參考
12/09 23:57, 1F

12/09 23:58, , 2F
參考的東西在更新 你拿到的東西也會更新
12/09 23:58, 2F
※ 編輯: ab790815 (111.255.185.226), 12/10/2015 00:08:26

12/10 00:11, , 3F
inputFrame.rgba()會變成Mat格式 rgba()只是以彩色輸出
12/10 00:11, 3F

12/10 00:12, , 4F
另外還有.gray() 以灰階輸出
12/10 00:12, 4F

12/10 08:16, , 5F
設一個條件只存第三張影像然後show出來,其他不要,試試看。
12/10 08:16, 5F

12/10 08:19, , 6F
stream是很多張單張影像連續撥放(經由buffer),跟stream無關
12/10 08:19, 6F

12/10 08:23, , 7F
函數已經return單張的image出來,要留住它需複製一份另外放
12/10 08:23, 7F

12/10 08:43, , 8F
這個我做過,沒程式碼沒辦法幫忙更多,加油
12/10 08:43, 8F

12/10 09:01, , 9F
我測試的方式是
12/10 09:01, 9F

12/10 09:02, , 10F
宣告一個全域 Mat 跟用來計數的全域int
12/10 09:02, 10F

12/10 09:02, , 11F
計數器加在這個funtion裡面
12/10 09:02, 11F

12/10 09:02, , 12F
每run一次就++
12/10 09:02, 12F

12/10 09:02, , 13F
我設條件
12/10 09:02, 13F

12/10 09:03, , 14F
計數器等於1的時候將第1幀影像存到 Mat
12/10 09:03, 14F

12/10 09:03, , 15F
然後把這個影像輸出到畫面
12/10 09:03, 15F

12/10 09:03, , 16F
理論上只會存一張影像
12/10 09:03, 16F

12/10 09:03, , 17F
且輸出的畫面是不會動的
12/10 09:03, 17F

12/10 09:03, , 18F
但結果是畫面還是會跟著鏡頭動
12/10 09:03, 18F

12/10 09:13, , 19F
我參考這個網站做的東西
12/10 09:13, 19F

12/10 09:13, , 20F

12/10 09:14, , 21F
可是我取得的基底背景會不斷被更新
12/10 09:14, 21F

12/10 09:15, , 22F
以至於會跟後面抓的影像一模一樣
12/10 09:15, 22F

12/10 10:27, , 23F
如果可以的話請您將程式碼張貼網站,方便大家幫忙debug
12/10 10:27, 23F

12/10 10:28, , 24F
如果不方便請用ptt私信code,也許比較能幫忙,謝謝。
12/10 10:28, 24F

12/10 13:13, , 25F
請問樓主的範例是去哪看的?最近也有這個需求需要研究
12/10 13:13, 25F

12/10 21:56, , 26F
To VSei:我找到解決辦法了,但原本的問題原因還是無解。
12/10 21:56, 26F

12/10 21:57, , 27F
因為程式碼被我改來改去,我正在還原原本錯誤的程式
12/10 21:57, 27F

12/10 21:58, , 28F
等我改好再跟你討論 感謝!!
12/10 21:58, 28F

12/10 22:00, , 29F
To z0furu : 我參考的是OpenCV官方4android的範例
12/10 22:00, 29F

12/10 22:01, , 30F
他第一個範例只是介紹怎麼用Camera而已
12/10 22:01, 30F

12/10 22:01, , 31F
不知道您的需求是怎樣的功能?
12/10 22:01, 31F

12/10 23:30, , 32F
這是我節錄比較重點部分的code
12/10 23:30, 32F

12/10 23:30, , 33F

12/10 23:42, , 34F
我希望印出一個不會動的影像,但結果是影像會一直被更新
12/10 23:42, 34F

12/11 00:29, , 35F
Camera=inputFrame.gray().clone()?
12/11 00:29, 35F

12/11 00:53, , 36F
.clone() 好像只是複製框架,並沒有複製內容的樣子。
12/11 00:53, 36F

12/11 14:39, , 37F
嗯,做出來了,code你參考看看。
12/11 14:39, 37F

12/11 14:43, , 38F
做一個menu(或button也可以),去觸發count
12/11 14:43, 38F

12/11 14:44, , 39F
畫面上開一個txtview去看count是否有正確運作
12/11 14:44, 39F

12/11 14:46, , 40F
再弄一個ImageView先顯示一張圖,count觸發條件時,改變影像
12/11 14:46, 40F

12/11 14:47, , 41F
就會知道camera是否有抓到值可以回傳或是沒抓到
12/11 14:47, 41F

12/11 14:50, , 42F
JavaCameraView會一直抓inputFrame.rgba()
12/11 14:50, 42F

12/11 14:52, , 43F
顯示單張圖在ImageView可能在BaseLoaderCallback沒執行作用
12/11 14:52, 43F

12/11 15:00, , 44F
OpenCVLoader.initAsync不需要一直load,初始化
12/11 15:00, 44F

12/11 19:22, , 45F
之前有碰過一點OpenCV,它的Mat基本上都是用參考的方式
12/11 19:22, 45F

12/11 19:27, , 46F
所以你的影像才會一直連動。
12/11 19:27, 46F

12/11 19:29, , 47F
看官方的documentation是說.clone()會複製出一份新的,
12/11 19:29, 47F

12/11 19:30, , 48F
可是實際使用OpenCV4Android就是跟C++版不一樣...
12/11 19:30, 48F

12/11 19:32, , 49F
感覺為了要在Android上運行,他們硬幹了很多東西...
12/11 19:32, 49F

12/11 22:01, , 50F
private Mat once = new Mat(); --> create一個新區域去放
12/11 22:01, 50F

12/11 22:28, , 51F
文章代碼(AID): #1MQ4dv8M (AndroidDev)
文章代碼(AID): #1MQ4dv8M (AndroidDev)