以下代码经笔者测试后实际可用,笔者的OpenCV版本为3.4.0。具体代码如下:
package haarDetectBody;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
public class PeopleDetectDemo {
public String detect(String inputPath){ // 参数为图片的路径
if(inputPath.isEmpty()){ // 判断是否有文件
System.out.println("没有输入文件!");
System.out.println("程序退出!");
System.exit(0);
}
Mat img = Imgcodecs.imread(inputPath); // 读取文件
DetectFullBody fdb = new DetectFullBody();
Mat mat = fdb.detect(img); // 检测,画矩形
String outputPath = "./data/result0.jpg";
Imgcodecs.imwrite(outputPath, mat); // 输出
System.out.println("完毕!文件已经输出!");
return outputPath; // 输出的路径
}
}
package haarDetectBody;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;
public class DetectFullBody {
public Mat detect(Mat img){
Mat mat = img.clone(); // 把拿到的Mat复制一下备用
CascadeClassifier cc = new CascadeClassifier("./data/haarcascade_fullbody.xml"); // 根据xml文件创建分类器,文件在opencv文件夹下可以找到
MatOfRect mor = new MatOfRect(); // 检测完毕后储存在这里
cc.detectMultiScale(mat, mor); // 检测
if(mor.toArray().length > 0){ // 判断是否检测到对象
for(Rect r:mor.toArray()){
Imgproc.rectangle(mat, new Point(r.x, r.y), new Point(r.x+r.width, r.y+r.height), new Scalar(0, 0, 255), 2); // 画出矩形
System.out.println("正在检测fullbody..."); // 检测到几个目标就输出几次
}
}else{
String error = "没有检测到目标!";
System.out.println(error);
}
return mat;
}
}
只贴出了实现功能的主要代码,还需要一个main方法来调用对应方法,对于代码的解释请参考注释。
这些代码能够简单的实现行人检测,对于部分检测会有检测不到目标的问题。检测不到有很多原因,在相关的行人检测文章中都可以找到,笔者在此不做赘述。此外,笔者的另一篇代码同样实现了行人检测,效果比本篇文章要稍微好一点,传送门:点这里