基于OpenCV的android多目标检测
我正在尝试开发一个应用程序来检测某些对象,如人、车辆和树木。作为一个开始,我试图端口,但我得到了一个非常低的帧速率与许多误报 我可能已经做了错误的解释和昂贵的计算,因为我刚开始OpenCV,也不太理解C++。p>基于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;
@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,帧处理会更快吗?还是换一种方式更好
- 我应该如何进行多目标检测
一根绳子有多长?毫无疑问,如果C++实现并使用JNI执行,代码将运行得更快。但是,要快多少取决于您没有提供给我们的许多信息,例如,
foundLocations
的大小。我相信OpenCV文档建议您在C++中实现任何非平凡的算法,@马尔科,即使用C++也很慢。我想在每一帧上运行描述符肯定会让事情变慢。是的,在每一帧上这样做可能是乐观的。您是否正在使用运行此操作的设备的所有CPU内核,以及是否具有最佳编译器标志?默认情况下,你不会得到ARMV7A部件的霓虹灯优化。我能找到的探测器只针对特定的物体。我相信在同一帧上使用更多的探测器只会让事情变得更慢?你说的“更多探测器”是什么意思?我指的是单独的探测器,用于人、车辆和其他我想探测的物体。没错。你必须把这些不同的探测器结合在一起。可能使用不同的模型,但使用相同的算法。尝试使用词袋方法,而不是用于检测单一类别对象的分类器。用弓梳的猪。