我目前正在开发一款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}}
非常感谢任何建议!感谢。
答案 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中的对我来说效果很好,可以降低应用的耗电量。