gpt4 book ai didi

java - 从 onCameraFrame、OpenCV、Android/Java 调用 HoughCircles() 方法时改变慢帧速率

转载 作者:太空宇宙 更新时间:2023-11-03 12:55:54 25 4
gpt4 key购买 nike

在 android 中使用 openCV Java 方法检测图像中的圆形物体时帧速率极慢

 Imgproc.HoughCircles(mGray, circles, Imgproc.CV_HOUGH_GRADIENT, 1, 50);

当我删除这个方法时它运行得很快,但是在这个回调中添加这个方法之后

  public Mat onCameraFrame(final CvCameraViewFrame inputFrame) {

帧速率减慢到每秒 1 到 2 帧,我不明白为什么它变得这么慢,我尝试将此方法放在一个单独的线程中但它无济于事,唯一有效的方法是使用计数器和 if 语句每 10 帧运行该方法。

在 OpenCV 示例中,有一个名为面部检测的示例项目,它同时具有原生 C++ 和 Java 相机版本,并且它们都变化很快,当我使用类似的代码时,我怎么可能从中获得这种缓慢的便秘 Action 打开简历?

我做错了什么吗?在 openCV 示例的人脸检测项目中,他们获取每一帧并且不启动单独的线程。我该如何解决这个问题并使我的代码像 OpenCV 中的示例项目一样快速运行?

在另一个项目中,我也遇到了同样的帧速率慢的问题,在这个练习项目中,我没有使用 openCV,它只是 android Camera 类,因为我从 onPreviewFrame( byte[] data, Camera camera) 方法并进行一些光处理,例如将 YUV 格式从字节数组转换为位图,并将其放入与相机 View 相同屏幕上的另一个 View 中,结果是帧速率变慢。

编辑:在一些额外的实验中,我将 Imgproc.HoughCircles() 方法添加到 OpenCV 人脸检测示例项目中。将此方法放在 java 检测器的 onCameraFrame 方法中。

结果和我的项目一样,变慢了。所以 HoughCircles 方法可能比人脸检测方法 CascadeClassifier.detectMultiScale() 需要更多的处理能力,但这并不能解释我在 youTube 上观看其他圆检测项目并且在他们的视频中帧速率没有减慢的事实。这就是为什么我认为我正在做的事情有问题。

这是我正在使用的代码示例

public class CircleActivity extends Activity implements CvCameraViewListener2 {

Mat mRgba;
Mat mGray;
File mCascadeFile;
CascadeClassifier mJavaDetector;
CameraBridgeViewBase mOpenCvCameraView;
LinearLayout linearLayoutOne;
ImageView imageViewOne;
int counter = 0;

private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS:
{
Log.i("OPENCV", "OpenCV loaded successfully");
mOpenCvCameraView.enableView();

} break;
default:
{
super.onManagerConnected(status);
} break;
}
}
};

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {

if (!OpenCVLoader.initDebug()) {
// Handle initialization error
}

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_coffee);

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.fd_activity_surface_view);

mOpenCvCameraView.setCvCameraViewListener(this);


}

@Override
public void onPause()
{
super.onPause();
if (mOpenCvCameraView != null)
mOpenCvCameraView.disableView();
}

@Override
public void onResume()
{
super.onResume();
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallback);
}

public void onDestroy() {
super.onDestroy();
mOpenCvCameraView.disableView();
}

public void onCameraViewStarted(int width, int height) {
mGray = new Mat();
mRgba = new Mat();

}

public void onCameraViewStopped() {
mGray.release();
mRgba.release();

}

public Mat onCameraFrame(final CvCameraViewFrame inputFrame) {
mRgba = inputFrame.rgba();
mGray = inputFrame.gray();
if(counter == 9) {

MatOfRect circles = new MatOfRect();

Imgproc.HoughCircles(mGray, circles, Imgproc.CV_HOUGH_GRADIENT, 1, 50);

// returns number of circular objects found
Log.e("circle check", "circles.cols() " + circles.cols());

}

counterAdder();

return mRgba;

} // end oncamera frame

public void counterAdder() {
if (counter > 10) {
counter = 0;

}
counter++;

}


}

最佳答案

降低相机帧的分辨率可能会有所帮助

mOpenCvCameraView.setMaxFrameSize(640, 480);

关于java - 从 onCameraFrame、OpenCV、Android/Java 调用 HoughCircles() 方法时改变慢帧速率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20466458/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com