嵌入式开发记录-day59 车牌识别qt程序设计

1、接上一节,创建完成工程后。因为我们有用到OpenCV接口来识别车牌,因此需要添加一些头文件和一些库文件

  我们把我们编译的libv4l-0.6.4库拷贝到/usr/local/opencv-2.4.9/lib/下面,并添加到工程的环境边境变量中;

  将百度AI的SDK拷贝到Ubuntu的qt工程下并解压,添加base、ocr,h到工程下

  

2、借助百度例子完善车牌识别

  1、完善id、key、秘钥(对应前面创建的接口)

// 设置APPID/AK/SK
    
std::string app_id = "你的 App ID";
    
std::string api_key = "你的 Api key";
    
std::string secret_key = "你的 Secret Key";

    
aip::Ocr client(app_id, api_key, secret_key);

  

   2、找到百度车牌识别例子

//我们只要把我们用摄像头拍的照片传到下面的这个函数就可以了
//aip::get_file_content("/assets/sample.jpg", &image)

Json::Value result;


std::string image;
aip::get_file_content("/assets/sample.jpg", &image);


// 调用车牌识别

result = client.license_plate(image, aip::null);


// 如果有可选参数
std::map<std::string, std::string> options;

options["multi_detect"] = "true";


// 带参数调用车牌识别

result = client.license_plate(image, options);

  

   3、完善之后的例子如下

  

 3、摄像头初始化

  这里通过摄像头获取车牌照片,显示在屏幕上并传给百度AI接口;

cvCreateCameraCapture,初始化从摄像头中获取视频
CvCapture* cvCreateCameraCapture( int index );index:要使用的摄像头索引

#include <highgui.h>

#include <cv.h>


void Widget::InitCamara()  //这个函数属于Widget

{
    //打开摄像头
    
//这句代码的意思是打开video4,括号中的參数仅仅要有:
    
// 0 , -1, 202 但要依据你自己的情况改,实測204可以成功打开
    
camera = cvCreateCameraCapture(204); 

}

// 添加头文件
#include <highgui.h>

#include <cv.h>

CvCapture *camera;//视频获取结构, 用来作为视频获取函数的一个参数

void InitCamara();

4、这里使用定时器在屏幕上显示照片,因此需要添加QTimer定时器类

//首先,我们在widget.h里面声明一个定时器,和一个槽函数,代码如下:
#include <QTimer> //包含QTimer头文件
QTimer    timer; //声明QTimer对象
private slots:
    
void ReadFarme(); //声明槽函数
timer.start(50); //启动定时器,1000为1S ,50为50ms,超时则发出timeoout信号

 IplImage  *frame; //申请IplImage类型指针,就是申请内存空间来存放每一帧图像
 QImage    imag; //声明QImage对象

void Widget::ReadFarme()

{
    
//从摄像头读取一张图片
    
//这个函数cvQueryFrame作用是从摄像头或者文件中抓取一帧
    
//参数为视频获取结构也就是我在初始化摄像头声明的CvCapture *camera;
    
frame = cvQueryFrame(camera);

    
//将图片格式转换成QImage格式,否则不能再lable上显示
    
imag = QImage((const uchar*)frame->imageData, 
                       
                                 frame->width, 
                           
                                 frame->height, 
                           
                                 QImage::Format_RGB888).rgbSwapped();
    
//用label显示一张图片
    
ui->frame->setPixmap(QPixmap::fromImage(imag));

}

// 定时器 超时
connect(&timer,SIGNAL(timeout()),this,SLOT(ReadFarme()));

5、将获取到的照片传给百度AI接口

std::string PlateNumber ;
int Ret;
       
frame = cvQueryFrame(camera);
//将图片格式转换成QImage格式,否则不能再lable上显示
    
imag = QImage((const uchar*)frame->imageData,
                            
frame->width,
                            
frame->height,

QImage::Format_RGB888).rgbSwapped();
    
//用label显示一张图片
    
ui->picture->setPixmap(QPixmap::fromImage(imag));
    
//保存图片到本地
imag.save("./PlateNumber.jpg", "JPG", 100);
      
//把拍下来的照片传递给百度AI接口获取车牌号
PlateNumber = GetPlateNumber("./PlateNumber.jpg");
    
//把接口返回来的数据显示到屏幕上
ui->plateNumber->setText(QString::fromStdString(PlateNumber));

// 将照片传给百度AI接口GetPlateNumber()

  

 6、程序完成后,切换到工程目录下,执行qmake,生成Makefile,执行make生成二进制文件,将该文件烧写到开发板中

  运行二进制文件

./identify -qws

 关于参数 -qws

View Code

 

posted @ 2020-12-13 11:33  笑不出花的旦旦  阅读(685)  评论(0)    收藏  举报