我在opencv中使用haarcascade成功检测到人脸。我已经运行了一个循环,它将仅裁剪检测到的图像部分并存储到系统中。但它只能裁剪一个检测到的脸部,其余的脸部不会被裁剪并保存到系统中。我附上了我的代码。请帮忙解决我的问题。例如。如果图像包含4个人,那么haarcascade会检测4个面部,但是循环只能裁剪一个检测到的图像,其余3个图像不会被裁剪..!
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");
//System.out.println ( "Working" );
// Input image
Mat image = Imgcodecs.imread("G:\\sample.jpg");
// Detecting faces
MatOfRect faceDetections = new MatOfRect();
faceDetector.detectMultiScale(image, faceDetections);
System.out.println(String.format("Detected %s faces",
faceDetections.toArray().length));
// Creating a rectangular box showing faces detected
Rect rectCrop=null;
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);
rectCrop = new Rect(rect.x, rect.y, rect.width, rect.height);
}
Rect[] count = faceDetections.toArray();
System.out.println(""+count.length);
// Saving the output image
String filename = "Ouput.jpg";
Imgcodecs.imwrite("G:\\"+filename, image);
Mat markedImage = new Mat(image,rectCrop);
Imgcodecs.imwrite("G:\\crop1.jpg",markedImage );
}
}
答案 0 :(得分:0)
您的代码循环遍历所有这些代码并选择最后一张脸然后保存该脸部。你需要它来a)单独裁剪它们并添加将它们标记在一起的元,或者b)将它们全部裁剪在一起。
对于选项a,在循环内,您需要单独保存每个文件。只需将文件代码保存到循环中并进行调整即可。
对于选项b,您可能需要一些其他软件来将所有面部裁剪在一起。这可以通过多种方式完成。您可以连接所有a)pixle数组,或b)单个字节。然后,当您需要在人与人之间找到联系时,您只需再次在文件上运行人脸识别软件。