Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于OpenCV的android多目标检测_Android_Opencv_Android Ndk_Java Native Interface_Object Detection - Fatal编程技术网

基于OpenCV的android多目标检测

基于OpenCV的android多目标检测,android,opencv,android-ndk,java-native-interface,object-detection,Android,Opencv,Android Ndk,Java Native Interface,Object Detection,我正在尝试开发一个应用程序来检测某些对象,如人、车辆和树木。作为一个开始,我试图端口,但我得到了一个非常低的帧速率与许多误报 我可能已经做了错误的解释和昂贵的计算,因为我刚开始OpenCV,也不太理解C++。p> @Override public Mat onCameraFrame(CvCameraViewFrame inputFrame) { Mat frame = inputFrame.rgba(); float minScale = 0.4f, maxScale = 5;

我正在尝试开发一个应用程序来检测某些对象,如人、车辆和树木。作为一个开始,我试图端口,但我得到了一个非常低的帧速率与许多误报

我可能已经做了错误的解释和昂贵的计算,因为我刚开始OpenCV,也不太理解C++。p>
@Override
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
    Mat frame = inputFrame.rgba();

    float minScale = 0.4f, maxScale = 5;    /* minimum and maximum scale to detect */
    int totalScales = 55;                   /* preferred number of scales between min and max */
    int threshold = -1;                     /* detections with score less then threshold will be ignored */

    HOGDescriptor hog = new HOGDescriptor();
    hog.setSVMDetector(HOGDescriptor.getDefaultPeopleDetector());

    MatOfRect foundLocations = new MatOfRect();
    MatOfDouble foundWeights = new MatOfDouble();

    Mat tempMat = new Mat(frame.rows(), frame.cols(), CvType.CV_8UC3);
    Imgproc.cvtColor(frame, tempMat, Imgproc.COLOR_RGBA2RGB);

    hog.detectMultiScale(tempMat, foundLocations, foundWeights, 1.5, new Size(8,8),
            new Size(32, 32), 1.05, 2, false);

    Vector<Rect> foundLocationsFilteredList = new Vector<Rect>();
    filterRects(foundLocations.toList(), foundLocationsFilteredList);

    for (Rect foundLocation : foundLocationsFilteredList) {
        Core.rectangle(frame, foundLocation.tl(), foundLocation.br(), new Scalar(0, 255, 0), 3);
    }

    tempMat.release();
    return frame;
}

private final void filterRects(List<Rect> candidates, List<Rect> objects) {
    for (int i = 0; i < candidates.size(); ++i) {
        Rect r = candidates.get(i);

        int j;
        for (j = 0; j < candidates.size(); ++j) {
            if (j != i && r.equals(candidates.get(j)))
                break;
        }

        if (j == candidates.size())
            objects.add(r);
    }
}
@覆盖
CameraFrame上的公用Mat(CvCameraViewFrame输入框){
Mat frame=inputFrame.rgba();
浮点最小刻度=0.4f,最大刻度=5;/*要检测的最小和最大刻度*/
int totalScales=55;/*最小值和最大值之间的首选刻度数*/
int threshold=-1;/*分数小于threshold的检测将被忽略*/
HOGDescriptor hog=新的HOGDescriptor();
setsvmdetator(HOGDescriptor.getDefaultPeopleDetector());
MatOfRect foundLocations=新的MatOfRect();
MatOfDouble foundWeights=新的MatOfDouble();
Mat tempMat=新Mat(frame.rows()、frame.cols()、CvType.CV_8UC3);
Imgproc.cvtColor(帧、tempMat、Imgproc.COLOR_RGBA2RGB);
hog.Detect多刻度(tempMat、foundLocations、foundWeights、1.5、新尺寸(8,8),
新尺寸(32,32),1.05,2,假);
Vector foundLocationsFilteredList=新向量();
filterRects(foundLocations.toList(),foundLocationsFilteredList);
对于(Rect foundLocation:foundLocationsFilteredList){
矩形(frame,foundLocation.tl(),foundLocation.br(),新标量(0,255,0),3);
}
tempMat.release();
返回框;
}
专用最终空过滤器链接(列出候选对象、列出对象){
对于(int i=0;i
  • 如果使用JNI,帧处理会更快吗?还是换一种方式更好
  • 我应该如何进行多目标检测

JNI无疑加速了这一过程。OpenCV4Android捆绑包中有一个JNI示例。我已经用OpenCV和JNI在Android上编写了一些程序,对我来说非常好。这是一个人脸检测的例子。用您自己的物体探测器更换探测器

对于各种探测器,参数中规定了检测多个或单个物体。转到文档。大多数情况下,检测器默认返回多个结果

编辑 下面是一个使用OpenCV的JNI示例。原来的跟踪器是在C++中,我把它改编成Android。欢迎叉子


一根绳子有多长?毫无疑问,如果C++实现并使用JNI执行,代码将运行得更快。但是,要快多少取决于您没有提供给我们的许多信息,例如,
foundLocations
的大小。我相信OpenCV文档建议您在C++中实现任何非平凡的算法,@马尔科,即使用C++也很慢。我想在每一帧上运行描述符肯定会让事情变慢。是的,在每一帧上这样做可能是乐观的。您是否正在使用运行此操作的设备的所有CPU内核,以及是否具有最佳编译器标志?默认情况下,你不会得到ARMV7A部件的霓虹灯优化。我能找到的探测器只针对特定的物体。我相信在同一帧上使用更多的探测器只会让事情变得更慢?你说的“更多探测器”是什么意思?我指的是单独的探测器,用于人、车辆和其他我想探测的物体。没错。你必须把这些不同的探测器结合在一起。可能使用不同的模型,但使用相同的算法。尝试使用词袋方法,而不是用于检测单一类别对象的分类器。用弓梳的猪。