[问题] 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