今年来到个新公司,不过万万没想到的是作为刚入职的新人第一次以为会接到一个普通的crud的模块,结果确接到了一个这么刺激的功能(未接触过的领域)。
公司里的运营团队在做运营的时候会录屏,所有需要我们开发人员做一个能够将视频转入接口里然后自动识别视频里的订单页面,然后再将订单页面以图片的形式给保存在文件夹里!
虽然这个从没做过,但这好歹是我程序员职业生涯的第一战一定要打好!
要筛选视频的页面,首先要做的是将视频变成一张张的图片,变成图片后才能进行图片识别进行一张张筛选!所以这里用的两个技术分别是 javacv和Tesseract-orc注解如下:
org.bytedeco
javacv-platform
1.5.2
net.sourceforge.tess4j
tess4j
4.4.0
除了这些还需要准备Tesseract-orc(不可少的)如下:
链接:https://download.csdn.net/download/a1079062541/16078591
当然公司的要求肯定是要求识别准确率的所以下面还有 训练字库(需要则下载)专门提高准确率如下:https://download.csdn.net/download/a1079062541/16079122
安装Tesseract-ocr的流程,反正无脑下一步就可以了!
安装好了以后把 训练字库解压把所以的内容cv到
接下来就是代码:
这里就是直接的调用
//训练文字库的位置
static String lagnguagePath = "C:\\Program Files\\Tesseract-OCR\\tessdata";
static ITesseract instance = new Tesseract();
public static void main(String[] args) throws IOException {
/* String r = "View order details";*/
Image("F:\\snapshot\\[email protected]\\114-6293536-9163409.mp4","F:\\mv","View order details");
}
这个方法是做过优化的,在视频转为图片的过程里会有大量的图片,让我们来举个栗子:
一个10分钟23帧的视频转成图片一共有601023张图片就是13800张图片。每张图片识别过程,简单的0.9秒复杂的3.2秒一共需要都是时间呢…
大家自行计算吧!
所以这里我做了一个操作,三秒进行一次识别,这样的话就过滤了大量重复的图片(当然也是根据运营的习惯做的需要的自行修改)。
//将视频的链接传入参数(videoPath)、结果图片路径(imagePath)、模糊匹配的参数(matching)
public static void Image(String videoPath,String imagePath,String matching) throws IOException {
//截取图片名称前的订单号当文件名
String str=videoPath.substring(videoPath.indexOf(".com\\")+5,videoPath.indexOf(".mp4"));
double skip;
//先获得视频路径和图片的目标路径
//获得FFmpegFrameGrabber(视频处理对象)
FFmpegFrameGrabber ff = FFmpegFrameGrabber.createDefault(videoPath);
ff.start();
//获取视频帧数(图片数)
int lengthInFrames = ff.getLengthInFrames();
for (int i=0;i<lengthInFrames;i++){
//因为目前的视频是23帧所有是三秒一次截图判断(根据需求抛弃掉无用的图片)
skip=i%69;
if (i==0||skip==0){
//一张张浏览图片
Frame frame = ff.grabImage();
System.out.println("第"+i+"张图片");
//进行图片识别
ImageRecognition.doExecuteFrame(frame, imagePath, i, matching, str);
}else{
//一张张浏览图片
ff.grabImage();
}
}
}
这里把所有的图片吐到自己想放到的区域
//获得需求的图片,图片(frame)、结果图片路径(imagePath)、图片坐标(帧数坐标index)、模糊匹配条件(matching)、图片名(ImageName)
public static boolean doExecuteFrame(Frame f, String targerFilePath, int index,String matching,String ImageName) throws IOException {
boolean img = false;
if (null == f||f.image==null) {
System.out.println("没有图片运行失败");
} else {
//使用帧数转换器
Java2DFrameConverter converter = new Java2DFrameConverter();
//选择格式 png
String imageMat = "png";
//获得缓冲图片
BufferedImage bi = converter.getBufferedImage(f);
String Imagename = targerFilePath + File.separator +""+ImageName+"_"+index+"."+imageMat;
System.out.println(Imagename);
//new一个文件类
File output = new File(Imagename);
//判断是否是需要获取的图片
//将图片吐到该区域
ImageIO.write(bi, imageMat, output);
//筛选图片
img = Img(Imagename, matching);
}
return img;
}
最后将区域里的图片放入Tesseract进行识别。
/**图片智能识别内容*
* ImagePath:图片的路径
* matching:匹配条件
* */
public static boolean Img(String ImagePath, String matching){
// 识别图片的路径(修改为自己的图片路径)
String path = ImagePath;
File file = new File(path);
// 语言库位置(修改为跟自己语言库文件夹的路径)
//设置训练库的位置
instance.setDatapath(lagnguagePath);
//chi_sim :简体中文, eng 根据需求选择语言库
instance.setLanguage("eng");
String result = null;
try {
long startTime = System.currentTimeMillis();
//提高图片的识别度
System.out.println(startTime);
//识别图片
result=instance.doOCR(file);
long endTime = System.currentTimeMillis();
System.out.println("Time is:" + (endTime - startTime) + " 毫秒");
} catch (TesseractException e){
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
if (result.contains(matching)){
System.out.println("匹配成功");
return true;
}else{
file.delete();
System.out.println("匹配失败!");
return false;
}
}
这样一个视频转图片和图片内容识别就完成了!这里只提供测试版(确保功能完好!)需要请自便!