创建线程后,相机之间无法切换

时间:2013-07-02 09:25:37

标签: android multithreading android-camera switching

大家早上好。

我正在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)

2 个答案:

答案 0 :(得分:0)

我对logcat中的CvException错误进行了一些研究。你操纵图像的方式似乎有问题。图像是否传递给ASync?验证检查后确保所有参数都正确。

答案 1 :(得分:0)

异步任务不应直接与onPreviewCallback()中收到的byte []一起使用。如果将像素复制到临时数组并将其传递给AsyncTask,则异常将消失。