大家早上好。
我正在Android环境中开发一个应用程序来捕获视频流中的帧,以便处理它们,然后在屏幕上显示已处理的帧。如果设备有两个摄像头,此应用程序允许在前置摄像头和后置摄像头之间切换。
在我创建后台处理线程(asynktask)之前,相机之间的切换一直有效。该程序可以正确地引入和执行线程,但如果我尝试更换相机,它会崩溃。 在asynk任务中,我只做以下操作:调整帧的大小,计算调整大小的帧上的一些点,根据原始帧的大小缩放点,在屏幕上显示原始帧,并在其上打印重新计算的点。
如果我尝试进行切换,我在logcat中得到的错误是:
07-02 11:14:41.649: ERROR/AndroidRuntime(16778): FATAL EXCEPTION: pool-1-thread-3
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:299)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
at java.util.concurrent.FutureTask.run(FutureTask.java:239)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
at java.lang.Thread.run(Thread.java:856)
Caused by: CvException [org.opencv.core.CvException: /home/reports/ci/slave_desktop/50-SDK/opencv/modules/imgproc/src/imgwarp.cpp:1723: error: (-215) ssize.area() > 0 in function void cv::resize(cv::InputArray, cv::OutputArray, cv::Size, double, double, int)
]
at org.opencv.imgproc.Imgproc.resize_0(Native Method)
at org.opencv.imgproc.Imgproc.resize(Imgproc.java:8461)
at com.micaela.myapp.MainActivity$ExtractFeaturesTask.scaleImage(MainActivity.java:764)
at com.micaela.myapp.MainActivity$ExtractFeaturesTask$1.handleMessage(MainActivity.java:678)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at com.micaela.myapp.MainActivity$ExtractFeaturesTask.doInBackground(MainActivity.java:736)
at com.micaela.myapp.MainActivity$ExtractFeaturesTask.doInBackground(MainActivity.java:649)
at android.os.AsyncTask$2.call(AsyncTask.java:287)
at java.util.concurrent.FutureTask.run(FutureTask.java:234)
答案 0 :(得分:0)
我对logcat中的CvException错误进行了一些研究。你操纵图像的方式似乎有问题。图像是否传递给ASync?验证检查后确保所有参数都正确。
答案 1 :(得分:0)
异步任务不应直接与onPreviewCallback()中收到的byte []一起使用。如果将像素复制到临时数组并将其传递给AsyncTask,则异常将消失。