作者ab790815 (CheeseMoon)
看板AndroidDev
标题[问题] OpenCV4Android做即时影像背景相减的问题
时间Wed Dec 9 23:34:14 2015
小弟是程设新手
最近对影像处理感兴趣所以摸摸看
现在想要做一个用手机镜头的即时影像做背景相减
检测差异处的程式
我参考 Opencv for Android 的第一个范例程式
内容主要是介绍 OpenCV 的 Camera 功能
这个范例里面用下面这个函式载入镜头取得的影像以及return到手机画面
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
return inputFrame.rgba();
}
因为背景相减要两张影像
所以我尝试在这里撷取前後帧影像
我用的方法是把上面的函式当作无穷回圈
读入第一张画面之後先暂存
读第二张影像之後再把第一张影像拿出来比对
而暂存的那张影像
理论上是一张不会动的影像
但我发现他还是会持续被更新
导致会跟第二张影像一模一样
我觉得问题可能是出在 inputFrame
好像不能直接从这里捞单张影像
我有查过资料
inputFrame 似乎是串流影像
不知道是不是因为这样
所以我暂存的影像实际上是变成了影片片段
我有试过输出暂存的影像(有设条件只存一次)
但输出的影像还是会跟着镜头动
--------------------------------------------
因为学浅不懂原理
烦请各位高手帮帮忙
如果问题叙述哪边看不懂我可以在补充
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 111.255.185.226
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/AndroidDev/M.1449675257.A.216.html
1F:推 soheadsome: 感觉是因为.rgba()会回传某东西的参考 12/09 23:57
2F:→ soheadsome: 参考的东西在更新 你拿到的东西也会更新 12/09 23:58
※ 编辑: ab790815 (111.255.185.226), 12/10/2015 00:08:26
3F:→ ab790815: inputFrame.rgba()会变成Mat格式 rgba()只是以彩色输出 12/10 00:11
4F:→ ab790815: 另外还有.gray() 以灰阶输出 12/10 00:12
5F:推 VSei: 设一个条件只存第三张影像然後show出来,其他不要,试试看。 12/10 08:16
6F:→ VSei: stream是很多张单张影像连续拨放(经由buffer),跟stream无关 12/10 08:19
7F:→ VSei: 函数已经return单张的image出来,要留住它需复制一份另外放 12/10 08:23
8F:→ VSei: 这个我做过,没程式码没办法帮忙更多,加油 12/10 08:43
9F:→ ab790815: 我测试的方式是 12/10 09:01
10F:→ ab790815: 宣告一个全域 Mat 跟用来计数的全域int 12/10 09:02
11F:→ ab790815: 计数器加在这个funtion里面 12/10 09:02
12F:→ ab790815: 每run一次就++ 12/10 09:02
13F:→ ab790815: 我设条件 12/10 09:02
14F:→ ab790815: 计数器等於1的时候将第1帧影像存到 Mat 12/10 09:03
15F:→ ab790815: 然後把这个影像输出到画面 12/10 09:03
16F:→ ab790815: 理论上只会存一张影像 12/10 09:03
17F:→ ab790815: 且输出的画面是不会动的 12/10 09:03
18F:→ ab790815: 但结果是画面还是会跟着镜头动 12/10 09:03
19F:→ ab790815: 我参考这个网站做的东西 12/10 09:13
21F:→ ab790815: 可是我取得的基底背景会不断被更新 12/10 09:14
22F:→ ab790815: 以至於会跟後面抓的影像一模一样 12/10 09:15
23F:→ VSei: 如果可以的话请您将程式码张贴网站,方便大家帮忙debug 12/10 10:27
24F:→ VSei: 如果不方便请用ptt私信code,也许比较能帮忙,谢谢。 12/10 10:28
25F:推 z0furu: 请问楼主的范例是去哪看的?最近也有这个需求需要研究 12/10 13:13
26F:→ ab790815: To VSei:我找到解决办法了,但原本的问题原因还是无解。 12/10 21:56
27F:→ ab790815: 因为程式码被我改来改去,我正在还原原本错误的程式 12/10 21:57
28F:→ ab790815: 等我改好再跟你讨论 感谢!! 12/10 21:58
29F:→ ab790815: To z0furu : 我参考的是OpenCV官方4android的范例 12/10 22:00
30F:→ ab790815: 他第一个范例只是介绍怎麽用Camera而已 12/10 22:01
31F:→ ab790815: 不知道您的需求是怎样的功能? 12/10 22:01
32F:→ ab790815: 这是我节录比较重点部分的code 12/10 23:30
34F:→ ab790815: 我希望印出一个不会动的影像,但结果是影像会一直被更新 12/10 23:42
35F:→ chenhaoftk: Camera=inputFrame.gray().clone()? 12/11 00:29
36F:→ ab790815: .clone() 好像只是复制框架,并没有复制内容的样子。 12/11 00:53
37F:推 VSei: 嗯,做出来了,code你参考看看。 12/11 14:39
38F:→ VSei: 做一个menu(或button也可以),去触发count 12/11 14:43
39F:→ VSei: 画面上开一个txtview去看count是否有正确运作 12/11 14:44
40F:→ VSei: 再弄一个ImageView先显示一张图,count触发条件时,改变影像 12/11 14:46
41F:→ VSei: 就会知道camera是否有抓到值可以回传或是没抓到 12/11 14:47
42F:→ VSei: JavaCameraView会一直抓inputFrame.rgba() 12/11 14:50
43F:→ VSei: 显示单张图在ImageView可能在BaseLoaderCallback没执行作用 12/11 14:52
44F:→ VSei: OpenCVLoader.initAsync不需要一直load,初始化 12/11 15:00
45F:推 Cycylno: 之前有碰过一点OpenCV,它的Mat基本上都是用参考的方式 12/11 19:22
46F:推 Cycylno: 所以你的影像才会一直连动。 12/11 19:27
47F:→ Cycylno: 看官方的documentation是说.clone()会复制出一份新的, 12/11 19:29
48F:→ Cycylno: 可是实际使用OpenCV4Android就是跟C++版不一样... 12/11 19:30
49F:→ Cycylno: 感觉为了要在Android上运行,他们硬干了很多东西... 12/11 19:32
50F:推 VSei: private Mat once = new Mat(); --> create一个新区域去放 12/11 22:01