利用OpenCV中的CascadeClassifier实现行人检测

以下代码经笔者测试后实际可用,笔者的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方法来调用对应方法,对于代码的解释请参考注释。

这些代码能够简单的实现行人检测,对于部分检测会有检测不到目标的问题。检测不到有很多原因,在相关的行人检测文章中都可以找到,笔者在此不做赘述。此外,笔者的另一篇代码同样实现了行人检测,效果比本篇文章要稍微好一点,传送门:点这里


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值