Android OpenCV:如何减慢相机捕获帧速率(故意)

时间:2015-03-04 07:01:56

标签: android opencv android-camera frame-rate

我目前正在开发一款Android人脸检测应用,我想知道如何有目的地降低捕获帧速率。目前它大约是30fps,我真正需要的是5-10fps。这样我就不需要使用可用于其他任务的额外处理。

我想知道Thread.sleep() cvSetCaptureProperty(CvCapture* capture, int property_id, double value)是否需要mOpenCvCameraView.setMaxFrameSize(640, 480);才能完成这项工作?我读到它只能在某些相机上使用,并且在大多数情况下是无用的......

我还阅读了有关设置最大帧大小的信息(例如public Mat onCameraFrame(CvCameraViewFrame inputFrame) { mRgba = inputFrame.rgba(); mGray = inputFrame.gray(); if (mAbsoluteFaceSize == 0) { int height = mGray.rows(); if (Math.round(height * mRelativeFaceSize) > 0) { mAbsoluteFaceSize = Math.round(height * mRelativeFaceSize); } mNativeDetector.setMinFaceSize(mAbsoluteFaceSize); } MatOfRect faces = new MatOfRect(); if (mDetectorType == JAVA_DETECTOR) { if (mJavaDetector != null) mJavaDetector.detectMultiScale(mGray, faces, SCALE_FACTOR, MIN_NEIGHBOURS, 2, new Size(mAbsoluteFaceSize, mAbsoluteFaceSize), new Size()); } else if (mDetectorType == NATIVE_DETECTOR) { if (mNativeDetector != null) mNativeDetector.detect(mGray, faces); } else { Log.e(TAG, "Detection method is not selected!"); } //put thread to sleep to slow capture? try { Thread.sleep(50); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } return mRgba; } ),但是...这对我来说没有意义吗?..

{{1}}

非常感谢任何建议!感谢。

3 个答案:

答案 0 :(得分:1)

我不建议您使用cvSetCaptureProperty(),因为它的行为非常狂热。

您应该将到达(和处理)的最后一帧的时间戳记录到onCameraFrame(),并且如果上一个时间戳与现在之间的差异小于~100毫秒,则从事件处理程序返回。

答案 1 :(得分:0)

您可以使用计数器。让我们说fps = 30,你想只处理5fs,然后我们有:

class YourClass{
   int counter = 0;
   // Your code
   public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
      counter++;
      if (counter < 6)
          return null;
      counter = 0;
      //Your processing code here
   }

}

答案 2 :(得分:0)

运行:

SystemClock.sleep(...);

onCameraFrame中的

对我来说效果很好,可以降低应用的耗电量。

相关问题