在opencv 的objdetect包中一些对物体的识别算法,研究的一个函数备戽。原本是打算用来为相机做虚化滤镜的,研究后发现,该函数似乎对近景识别率不如远景高,可能是参数问题,也可能是SVM库训练不够,暂时记下,待后研究,可能可以用于家用摄像头开发。
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfDouble;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.HOGDescriptor;
public class People {
public static void main(String[] args) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
Mat src = Highgui.imread("E:/work/qqq/b7.jpg");
if (src.empty()) {
System.out.println("enter People");
}
if (src.cols() > 1000 || src.rows() > 1000)
Imgproc.resize(src, src, new Size(src.cols() / 3, src.rows() / 3));
Mat dst = findPeople(src);
Highgui.imwrite("E:/work/qqq/Y4.jpg", dst);
}
public static Mat findPeople(Mat image) {
if (image.empty()) {
System.out.println("image is exist");
}
HOGDescriptor hog = new HOGDescriptor();
hog.setSVMDetector(HOGDescriptor.getDefaultPeopleDetector());
// hog.setSVMDetector(HOGDescriptor.getDaimlerPeopleDetector());
MatOfRect regions = new MatOfRect();
MatOfDouble foundWeights = new MatOfDouble();
hog.detectMultiScale(image, regions, foundWeights); // ,0, new Size(8,
// 8), new Size(32,
// 32), 1.05, true);
for (Rect rect : regions.toArray()) {
Core.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height),
new Scalar(0, 0, 255), 2);
}
return image;
}
}