我是OpenCV的新手。我能够从webCam中检测到脸部。我有点困惑如何保存检测到的脸,如何保存和识别再次那个人再次来到相机前。
检测代码
private void detectAndDisplay(Mat frame)
{
MatOfRect faces = new MatOfRect();
Mat grayFrame = new Mat();
// convert the frame in gray scale
Imgproc.cvtColor(frame, grayFrame, Imgproc.COLOR_BGR2GRAY);
// equalize the frame histogram to improve the result
Imgproc.equalizeHist(grayFrame, grayFrame);
// compute minimum face size (20% of the frame height, in our case)
if (this.absoluteFaceSize == 0)
{
int height = grayFrame.rows();
if (Math.round(height * 0.2f) > 0)
{
this.absoluteFaceSize = Math.round(height * 0.2f);
}
}
// detect faces
this.faceCascade.detectMultiScale(grayFrame, faces, 1.1, 2, 0 | Objdetect.CASCADE_SCALE_IMAGE,
new Size(this.absoluteFaceSize, this.absoluteFaceSize), new Size());
// each rectangle in faces is a face: draw them!
Rect[] facesArray = faces.toArray();
for (int i = 0; i < facesArray.length; i++)
Imgproc.rectangle(frame, facesArray[i].tl(), facesArray[i].br(), new Scalar(0, 255, 0), 3);
}
答案 0 :(得分:2)
如果您想保存检测到的脸部图像,也许您可以尝试这样的事情
for (int i = 0; i < facesArray.length; i++)
{
Imgproc.rectangle(frame, facesArray[i].tl(), facesArray[i].br(), new Scalar(0, 255, 0), 3);
Rect rect(facesArray[i].tl().x, facesArray[i].tl().y, facesArray[i].br().x - facesArray[i].tl().x, facesArray[i].br().y - facesArray[i].tl().y);
Mat cropFace = frame(rect);
imwrite("./face"+i+".jpg", cropFace);
}
答案 1 :(得分:0)
我得到了解决方案
for (Rect rect : facesArray) {
Imgproc.rectangle(frame, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height),
new Scalar(0, 255, 0)); // frame is Mat
rectCrop = new Rect(rect.x, rect.y, rect.width, rect.height);
Mat image_roi = new Mat(frame,rectCrop);
Imgcodecs.imwrite("./face"+ i +".jpg",image_roi);
i++;
}
现在,我可以裁剪多个面孔