在android中使用openCV Java方法检测图像中的圆形对象时帧速率极慢
imgproc.HoughCircles(mGray, circles, imgproc.CV_HOUGH_GRADIENT, 1, 50);
当我删除此方法时,它运行速度很快,但在此回调中添加此方法后
public Mat onCameraFrame(final CvCameraviewFrame inputFrame) {
帧速率减慢到每秒1到2帧,我不明白为什么它变得如此慢,我尝试将此方法放在一个单独的线程中,它没有帮助,唯一有效的是使用计数器和和每10帧运行一次方法的if语句.
在OpenCV示例中有一个名为面部检测的示例项目,它既有本机C版本又有Java相机版本,并且它们都变化很快,当我使用类似代码时,我怎么可能从OpenCV获得这种缓慢的便秘行为?
我在这里做错了吗?在openCV示例的面部检测项目中,它们采用每一帧,并且它们不会启动单独的线程.如何修复此问题并使我的代码像OpenCV中的示例项目一样快速运行?
在一个不同的项目中我也有同样的帧速率慢的问题,在这个练习项目中我没有使用openCV,它只是androID Camera类,因为我从onPrevIEwFrame(byte []中获取图像数据,相机摄像头)方法和做一些光处理,如将YUV格式从字节数组转换为位图,并将其放入与摄像机视图相同的屏幕上的另一个视图,结果是慢帧速率变化.
编辑:在一些额外的实验中,我将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);
总结 以上是内存溢出为你收集整理的从onCameraFrame,OpenCV,Android / Java调用HoughCircles()方法时,帧速率会变慢全部内容,希望文章能够帮你解决从onCameraFrame,OpenCV,Android / Java调用HoughCircles()方法时,帧速率会变慢所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)