Всем привет, мы снова встретились, я ваш друг Цюаньчжаньцзюнь.
Официальный сайт Opencv загружает установочный пакет Windows https://opencv.org/releases/ Выберите последнюю версию 4.1.1. После завершения загрузки это будет opencv-4.1.1-vc14_vc15.exe, дважды щелкните для установки.
важный: Скопируйте два файла по пути установки D:\Sofeware\opencv\build\bin в D:\Sofeware\opencv\build\java\x64 (Чтобы поддержать чтениевидеопоток)
Открыть проект structure –> modules –>dependencies Представьте D:\Sofeware\opencv\build\java opencv-411.jar в папке, затем отредактируйте этот пакет и добавьте его в D:\Sofeware\opencv\build\x64. Ресурсы на пути
<!-- opencv + javacv + ffmpeg-->
<dependency>
<groupId>org.bytedeco.javacpp-presets</groupId>
<artifactId>ffmpeg</artifactId>
<version>4.1-1.4.4</version>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv</artifactId>
<version>1.4.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.bytedeco.javacpp-presets/ffmpeg-platform -->
<dependency>
<groupId>org.bytedeco.javacpp-presets</groupId>
<artifactId>ffmpeg-platform</artifactId>
<version>4.1-1.4.4</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<!-- видео веб-камера -->
<!-- https://mvnrepository.com/artifact/org.bytedeco/javacv-platform -->
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv-platform</artifactId>
<version>1.4.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.bytedeco.javacpp-presets/opencv-platform -->
<dependency>
<groupId>org.bytedeco.javacpp-presets</groupId>
<artifactId>opencv-platform</artifactId>
<version>4.0.1-1.4.4</version>
</dependency>
Обратите внимание на изменение следующих faceDetector = new CascadeClassifier( Измените путь .xml на свой путь.
package com.jack.demo.face;
import org.opencv.core.*;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;
import org.opencv.videoio.VideoCapture;
import org.opencv.videoio.VideoWriter;
import org.opencv.videoio.Videoio;
import java.util.Arrays;
/** * * @Title: Opencv Распознавание лиц по изображениям, распознавание лиц с помощью камеры в реальном времени, распознавание лиц в видеофайлах * @Description: OpenCV-4.1.1 тестовый файл * @date: 19 августа 2019 г. 17:17:48 * @version: V-1.0.0 * */
public class FaceVideo {
// Инициализировать детектор лиц
static CascadeClassifier faceDetector;
static int i=0;
static {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
faceDetector = new CascadeClassifier("D:\\Sofeware\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml");
}
public static void main(String[] args) {
// 1- Распознавание лиц с камеры в режиме реального времени, успешное распознавание сохраняет изображение на локальном компьютере.
getVideoFromCamera();
// 2- Распознавание лиц из локальных файлов
// getVideoFromFile();
// 3- Распознавание лица по локальному изображению, успешное распознавание и сохранение изображения лица в локальном хранилище.
face();
// 4- Сравните сходство лиц на двух местных фотографиях. (Чем ближе к 1, тем больше похоже)
String basePicPath = "D:\\Documents\\Pictures\\";
double compareHist = compare_image(basePicPath + "fc.jpg", basePicPath + "fc_1.jpg");
System.out.println(compareHist);
if (compareHist > 0.72) {
System.out.println("Сопоставление лиц");
} else {
System.out.println("лицо не совпадает");
}
}
/** * OpenCV-4.1.1 Читайте в реальном времени с камеры * @return: void * @date: 19 августа 2019 г. 17:20:13 */
public static void getVideoFromCamera() {
//1 Если вы хотите получать видео с веб-камеры тогда это должно быть в VideoCapture Метод конструктора написан 0
VideoCapture capture=new VideoCapture(0);
Mat video=new Mat();
int index=0;
if (capture.isOpened()) {
while(i<3) {
// Выход после 3 успешных матчей
capture.read(video);
HighGui.imshow("Распознавание лиц в реальном времени", getFace(video));
index=HighGui.waitKey(100);
if (index==27) {
capture.release();
break;
}
}
}else{
System.out.println("Камера не включена");
}
try {
capture.release();
Thread.sleep(1000);
System.exit(0);
} catch (InterruptedException e) {
e.printStackTrace();
}
return;
}
/** * OpenCV-4.1.1 Чтение из видеофайла * @return: void * @date: 19 августа 2019 г. 17:20:20 */
public static void getVideoFromFile() {
VideoCapture capture=new VideoCapture();
capture.open("C:\\Users\\Administrator\\Desktop\\1.avi");//1 Путь для чтения видеофайла
if(!capture.isOpened()){
System.out.println("Не удалось прочитать видеофайл!");
return;
}
Mat video=new Mat();
int index=0;
while(capture.isOpened()) {
capture.read(video);//2 видеофайл запись видео Mat video середина
HighGui.imshow("Локальное видеораспознавание лиц", getFace(video));//3 показать изображение
index=HighGui.waitKey(100);//4 Получить ввод с клавиатуры
if(index==27) {
//5 в случае Esc затем выйдите
capture.release();
return;
}
}
}
/** * OpenCV-4.1.1 распознавание лиц * @date: 19 августа 2019 г. 17:19:36 * @param image Мат изображения для обработки (определенный кадр видеосередина) * @return Обработанные фотографии */
public static Mat getFace(Mat image) {
// 1 Прочтите распознавание, которое поставляется с OpenCV. XML-файл функции лиц (faceDetector)
// CascadeClassifier facebook=new CascadeClassifier("D:\\Sofeware\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml");
// 2 Класс соответствия объектов
MatOfRect face = new MatOfRect();
// 3 сопоставление функций
faceDetector.detectMultiScale(image, face);
Rect[] rects=face.toArray();
System.out.println("соответствует "+rects.length+" Личное лицо»);
if(rects != null && rects.length >= 1) {
// 4 Нарисуйте круг для каждого распознанного лица.
for (int i = 0; i < rects.length; i++) {
Imgproc.rectangle(image, new Point(rects[i].x, rects[i].y), new Point(rects[i].x + rects[i].width, rects[i].y + rects[i].height), new Scalar(0, 255, 0));
Imgproc.putText(image, "Human", new Point(rects[i].x, rects[i].y), Imgproc.FONT_HERSHEY_SCRIPT_SIMPLEX, 1.0, new Scalar(0, 255, 0), 1, Imgproc.LINE_AA, false);
//Mat dst=image.clone();
//Imgproc.resize(image, image, new Size(300,300));
}
i++;
if(i==3) {
// Получите фото 10-го успешного матча
Imgcodecs.imwrite("D:\\Documents\\Pictures\\" + "face.png", image);
}
}
return image;
}
/** * OpenCV-4.1.1 картинараспознавание лиц * @return: void * @date: 7 мая 2019 12:16:55 */
public static void face() {
// 1 Прочтите распознавание, которое поставляется с OpenCV. XML-файл характеристик лиц
//OpenCV Библиотеки распознавания изображений обычно расположены по адресу opencv\sources\data под
// CascadeClassifier facebook=new CascadeClassifier("D:\\Sofeware\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml");
// 2 Читать тестовые картинки
String imgPath = "D:\\Documents\\Pictures\\he.png";
Mat image=Imgcodecs.imread(imgPath);
if(image.empty()){
System.out.println("image Контента не существует! ");
return;
}
// 3 сопоставление функций
MatOfRect face = new MatOfRect();
faceDetector.detectMultiScale(image, face);
// 4 соответствовать Rect матрица множество
Rect[] rects=face.toArray();
System.out.println("соответствует "+rects.length+" Личное лицо»);
// 5 Нарисуйте круг для каждого распознанного лица.
int i =1 ;
for (Rect rect : face.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), 3);
imageCut(imgPath, "D:\\Documents\\Pictures\\"+i+".jpg", rect.x, rect.y, rect.width, rect.height);// Обрезать изображение
i++;
}
// 6 Показать изображения
HighGui.imshow("распознавание лиц", image);
HighGui.waitKey(0);
}
/** * Обрезать лицо * @param imagePath * @param outFile * @param posX * @param posY * @param width * @param height */
public static void imageCut(String imagePath, String outFile, int posX, int posY, int width, int height) {
// исходное изображение
Mat image = Imgcodecs.imread(imagePath);
// Перехватываемая область: параметры, координата X, координата Y, ширина скриншота, длина скриншота.
Rect rect = new Rect(posX, posY, width, height);
// Оба предложения имеют одинаковый эффект
Mat sub = image.submat(rect); // Mat sub = new Mat(image,rect);
Mat mat = new Mat();
Size size = new Size(width, height);
Imgproc.resize(sub, mat, size);// Сделайте скриншот лица и сохраните его.
Imgcodecs.imwrite(outFile, mat);
System.out.println(String.format("Изображение успешно обрезано. Файл изображения после обрезки: %s", outFile));
}
/** * Сравнение лиц * @param img_1 * @param img_2 * @return */
public static double compare_image(String img_1, String img_2) {
Mat mat_1 = conv_Mat(img_1);
Mat mat_2 = conv_Mat(img_2);
Mat hist_1 = new Mat();
Mat hist_2 = new Mat();
//цветовой диапазон
MatOfFloat ranges = new MatOfFloat(0f, 256f);
//Размер гистограммы, Чем больше соответствие, тем оно точнее (помедленнее)
MatOfInt histSize = new MatOfInt(1000);
Imgproc.calcHist(Arrays.asList(mat_1), new MatOfInt(0), new Mat(), hist_1, histSize, ranges);
Imgproc.calcHist(Arrays.asList(mat_2), new MatOfInt(0), new Mat(), hist_2, histSize, ranges);
// CORREL Коэффициент корреляции
double res = Imgproc.compareHist(hist_1, hist_2, Imgproc.CV_COMP_CORREL);
return res;
}
/** * Лицо в оттенках серого * @param img * @return */
public static Mat conv_Mat(String img) {
Mat image0 = Imgcodecs.imread(img);
Mat image1 = new Mat();
// Оттенки серого
Imgproc.cvtColor(image0, image1, Imgproc.COLOR_BGR2GRAY);
// Обнаружение лиц
MatOfRect faceDetections = new MatOfRect();
faceDetector.detectMultiScale(image1, faceDetections);
// rectсерединачеловеческое лицокартинадиапазон
for (Rect rect : faceDetections.toArray()) {
Mat face = new Mat(image1, rect);
return face;
}
return null;
}
/** * OpenCV-4.1.1 Запишите видео, снятое камерой локально * @return: void * @date: 19 августа 2019 г. 17:20:48 */
public static void writeVideo() {
//1 Если вы хотите получать видео с веб-камеры тогда это должно быть в VideoCapture Метод конструктора написан 0
VideoCapture capture=new VideoCapture(0);
Mat video=new Mat();
int index=0;
Size size=new Size(capture.get(Videoio.CAP_PROP_FRAME_WIDTH),capture.get(Videoio.CAP_PROP_FRAME_HEIGHT));
VideoWriter writer=new VideoWriter("D:/a.mp4",VideoWriter.fourcc('D', 'I', 'V', 'X'), 15.0,size, true);
while(capture.isOpened()) {
capture.read(video);//2 Напишите видео камеры Mat video середина
writer.write(video);
HighGui.imshow("Фото получить видео", video);//3 показать изображение
index=HighGui.waitKey(100);//4 Получить ввод с клавиатуры
if(index==27) {
//5 в случае Esc затем выйдите
capture.release();
writer.release();
return;
}
}
}
}
Если запуститьMainМетод сообщает об ошибке:java.lang.UnsatisfiedLinkError: no opencv_java411 in java.library.path
(Необходимо добавить рабочий параметр)
Изменить класс запуска: Изменить Configuration VM options:-Djava.library.path=D:\Sofeware\opencv\build\java\x64;
Издатель: Лидер стека программистов полного стека, укажите источник для перепечатки: https://javaforall.cn/144970.html Исходная ссылка: https://javaforall.cn