Java+OpenCV目标检测
简介:大学生一枚,加入了学校项目组学习,参与到项目中,最近项目需要,通过各方面的学习,做了一个小小的物体识别的cascade.xml,把自己学到的干货分享出来。
环境:jdk1.8 opencv 3.4.0
首先,我们要有足量的图像,我相信这个各位是有办法收集到自己想要检测的目标的图像的。实际训练过程中,我发现500左右已经可以大体上识别到自己想要的目标,但是如果想要更高的精度,建议在1000+的正面例子,反面例子的话只要里面没有目标图像,可以是任何图像,但是建议根据实际需要,在所处的场景中截取不含正面例子的图像作为反面例子。据了解,正:反最佳比例是1:3左右哦。
下面开始上代码了,我把需要的东西都整合了,只需要图像文件地址就可以把所需的文件生成进行训练的操作。
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
public class Project{
//下面都是文件src,根据自己的实际情况填写
public static String posFilePath = "";//正面例子源文件夹
public static String posOutPath = "";//正面例子输出文件夹
public static String posTxtPath = "";//正面例子信息txt文件
public static String negFilePath = "";//反面例子源文件夹
public static String NegOutPath = "";//反面例子输出文件夹
public static String negTxtPath = "";//反面例子信息txt文件
//修改文件大小为20*20 可自定义设置,根据opencv官方推荐20*20效果最佳,
//个人建议最大不要超过40*40,太大的话跑不太动
public static int width = 20 ;
public static int height = 20 ;
//导入opencv库
static {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
}
public static void renameFiles(String filePath){
File file = new File(filePath);
File[] files = file.listFiles();
int i = 0;
for (File f : files){
f.renameTo(new File(filePath+"\\"+i+".jpg"));
i++;
}
}
//获取img和txt的过程
/*
* 1、对图片缩放至20*20
* 2、对图片进行灰度处理
* 3、获取Txt
* */
public static void getPosImgAndTxt() throws IOException {
Fil