OpenCV HaarCascade人脸检测仅裁剪单张人脸问题求助
解决OpenCV HaarCascade仅裁剪保存单张人脸的问题
看了你的代码,问题很明确:你把人脸裁剪和保存的逻辑放到了循环外面,而且只保留了最后一个检测到的人脸区域。这就导致哪怕检测到4张脸,最后也只会处理循环结束时最后一个rect对应的人脸。
问题代码的核心错误点
- 循环内只更新了
rectCrop变量,但没有执行裁剪和保存操作,循环结束后rectCrop仅存储最后一张人脸的区域 - 仅在循环外执行了一次
imwrite,自然只能保存一张人脸 - 还有个小语法错误:
Imgcodecs.imwrite("G:\"+filename, image);里的路径少了一个反斜杠,应该写成"G:\\" + filename
修改后的完整代码
import org.opencv.core.Core; 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.imgcodecs.Imgcodecs; import org.opencv.imgproc.Imgproc; import org.opencv.objdetect.CascadeClassifier; public class FaceDetection { public static void main(String[] args) { System.loadLibrary(Core.NATIVE_LIBRARY_NAME); CascadeClassifier faceDetector = new CascadeClassifier(); faceDetector.load("G:\\haarcascade_frontalface_alt.xml"); // 读取输入图像 Mat image = Imgcodecs.imread("G:\\sample.jpg"); // 检测人脸 MatOfRect faceDetections = new MatOfRect(); faceDetector.detectMultiScale(image, faceDetections); int faceCount = faceDetections.toArray().length; System.out.println(String.format("Detected %s faces", faceCount)); // 遍历每一个检测到的人脸 int faceIndex = 1; for (Rect rect : faceDetections.toArray()) { // 在原图上绘制人脸框 Imgproc.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(0, 255, 0), 2); // 裁剪当前人脸区域 Mat croppedFace = new Mat(image, rect); // 生成唯一的文件名,避免覆盖 String cropFilename = "crop" + faceIndex + ".jpg"; // 保存裁剪后的人脸 Imgcodecs.imwrite("G:\\" + cropFilename, croppedFace); faceIndex++; } // 保存绘制了人脸框的原图 String filename = "Output.jpg"; Imgcodecs.imwrite("G:\\" + filename, image); System.out.println("所有人脸已完成裁剪保存"); } }
关键修改说明
- 将裁剪保存逻辑移入循环:现在每遍历到一个人脸
rect,就立即裁剪并保存,确保所有检测到的人脸都被处理 - 生成唯一文件名:用
faceIndex变量给每张裁剪后的图片命名(crop1.jpg、crop2.jpg...),避免后保存的图片覆盖之前的 - 移除冗余变量:不需要单独定义
rectCrop,直接使用循环中的rect来创建裁剪区域即可 - 修正路径语法错误:把路径中的
"G:\"改为"G:\\",避免编译报错
这样修改后,不管检测到多少张人脸,都会被逐一裁剪并保存到你的指定目录下。
内容的提问来源于stack exchange,提问作者omkarlanghe
相关产品推荐
相关产品推荐

