LinuxOpenCV+zBar实现二维码识别
LinuxOpenCV+zBar实现⼆维码识别第⼀个版本
特点:实现简单、但局限于亮度 清晰度好,没有扭曲变形的情况。
main.cpp
优秀班集体申报材料#include"iostream"
#include"opencv2/opencv.hpp"
#include"zbar.h"
using namespace std;
using namespace cv;
using namespace zbar;
#define WINDOW_NAME "clor"
#define WINDOW_GARY_NAME "gary"
30万suv推荐int main()
{
namedWindow(WINDOW_NAME, WINDOW_AUTOSIZE);
namedWindow(WINDOW_GARY_NAME, WINDOW_AUTOSIZE);
// 加载⼆维码图⽚
Mat image;
// image = imread("./picture/test.jpg");
image =imread("./picture/QRcode.jpg");
// image = imread("./picture/barCode.jpg");
// image = imread("./picture/2Code.png");
// image = Mat(240,320,CV_8UC3,Scalar(0,255,0));
cout <<"---------------- 图像参数 ------------------"<<endl;
// 标志位
cout <<"flags:"<< image.flags << endl;
// 图像尺⼨
cout <<"size:"<< image.size << endl;
// 列宽
cout <<"clos:"<< ls<<endl;
// ⾏⾼
cout <<"rows:"<< ws << endl;
// 维度
cout <<"dims:"<< image.dims << endl;
cout <<"------------------------------------------"<<endl;
imshow(WINDOW_NAME,image);
// 灰度转换
Mat imageGray;
cvtColor(image, imageGray, COLOR_RGB2GRAY);
imshow(WINDOW_GARY_NAME,imageGray);
// 获取⼆进制数据
int width = ls;
int height = ws;
uchar *raw =(uchar *)imageGray.data;
Image imageZbar =Image(width, height,"Y800", raw, width * height);
/
/ 配置扫描器,开始扫描
ImageScanner scanner;
scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE,1);
scanner.scan(imageZbar);
// 扫描结果打印
if(imageZbar.symbol_begin()== imageZbar.symbol_end())
西安游玩{
cout <<"识别错误!"<< endl;
}
// 遍历所有识别到的⼆维码后者条形码
Image::SymbolIterator symbol = _symbols();
for(; symbol != imageZbar.symbol_end();++symbol)
{
cout <<"类型:\t"<< symbol->get_type_name()<< endl;
cout <<"条码:\t"<< symbol->get_data()<< endl << endl;
}
// 释放资源
imageZbar.set_data(NULL,0);
waitKey(0);
return0;
}
第⼆个版本
特点:可以⽐较好的识别出⼆维码,但是检测效果有待优化。/******************************************************
⽂件名  :main.cpp
描述  :条形码,⼆维码的识别
语⾔  :
作者  :范泽华
修改  :
⽇期  :2018-05-19
说明  :需要Zbar的⽀持
******************************************************/
#include<opencv2/opencv.hpp>
#include"opencv2/imgproc/types_c.h"
#include"opencv2/imgcodecs/legacy/constants_c.h"
#include"opencv2/imgproc/imgproc_c.h"
#include<iostream>
#include<zbar.h>
using namespace cv;
using namespace std;
using namespace zbar;
//using std::vector;
class MyClass
{
public:
MyClass();
MyClass(char** argv);
~MyClass();
void Dis_code(Mat image);
void Run();
void QrRun();
Mat getGray(Mat image,bool show =false);//获取灰度图
Mat getGass(Mat image,bool show =false);//⾼斯平滑滤波
Mat getSobel(Mat image,bool show =false);//Sobel x—y梯度差
Mat getBlur(Mat image,bool show =false);//均值滤波除⾼频噪声
Mat getThold(Mat image,bool show =false);//⼆值化
Mat getBys(Mat image,bool show =false);//闭运算
Mat getErode(Mat image,bool show =false);//腐蚀
Mat getDilate(Mat image,bool show =false);//膨胀
Mat getRect(Mat image, Mat simage,bool show =false);//获取范围 Mat getRotate(Mat image,double angle);
bool IsCorrect(Point point[]);//判断是否正对
void WriteFile(Mat image, String filename);
private:
Mat srcimage;//原图
Mat element;//核
};
void MyClass::WriteFile(Mat image, String filename)
{
filename +=".jpg";
std::vector<uchar> vbuffer;
std::vector<int> param = std::vector<int>(2);
param[0]= CV_IMWRITE_JPEG_QUALITY;
param[1]=95;// default(95) 0-100
cv::imencode(".jpg", image, vbuffer, param);
FILE* pfd =fopen(filename.c_str(),"w+");
if(NULL== pfd)
{
复婚需要哪些手续perror("fopen failed!\n");
return;
}
fwrite(vbuffer.data(), vbuffer.size(),1, pfd);
fflush(pfd);
fclose(pfd);
String cmd ="chmod 777 ";
cmd += filename;
system(cmd.c_str());
return;
}
/******************************************************
函数名称: MyClass
函数功能:初始化
传⼊参数:
返回值:
建⽴时间: 2018-05-19
修改时间:
建⽴⼈:范泽华
修改⼈:
其它说明:
******************************************************/
MyClass::MyClass()
{
srcimage =imread("core.jpg");//"F:\Pictures\qr.png""F:\Pictures\条形码.png"
//srcimage = imread("F:\\Pictures\\qr测试.png");
//srcimage = imread("条码.jpg");
pty()){
printf("⽂件不存在");
exit(1);
}
//resize(srcimage, srcimage, Size(srcimage.size().width/2, srcimage.size().height/2)); element =getStructuringElement(0,Size(7,7));
//Dis_code(srcimage);
}
/******************************************************
函数名称: MyClass
函数功能:初始化
传⼊参数: char* argv
返回值:
建⽴时间: 2018-05-19
修改时间:
建⽴⼈:范泽华
修改⼈:
其它说明:
******************************************************/
MyClass::MyClass(char** argv)
srcimage =imread(argv[1]);
pty()){
printf("⽂件不存在");
exit(1);
金融市场包括}
resize(srcimage, srcimage,Size(500,500));
element =getStructuringElement(0,Size(7,7));
}
/******************************************************
函数名称: ~MyClass
函数功能:释放空间
传⼊参数:
返回值:
建⽴时间: 2018-05-19
修改时间:
建⽴⼈:范泽华
修改⼈:
其它说明:
******************************************************/
MyClass::~MyClass()
{
}举杯邀明月对影成三人
/******************************************************
函数名称: Dis_Barcode
函数功能:识别条形码和⼆维码
传⼊参数:
返回值:
建⽴时间: 2018-05-19
修改时间:
建⽴⼈:范泽华
修改⼈:
其它说明:这⾥是借鉴其他⼈的代码:
原⽂链接:wwwblogs/dengxiaojun/p/5278679.html
以下代码是经过改动的
******************************************************/
void MyClass::Dis_code(Mat image){
Mat imageGray;// 所转化成的灰度图像
//定义⼀个扫描仪
ImageScanner scanner;
scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE,1);
cvtColor(image, imageGray, CV_RGB2GRAY);
//imshow("灰度图", imageGray);
// 获取所摄取图像的长和宽
int width = ls;
int height = ws;
// 在Zbar中进⾏扫描时候,需要将OpenCV中的Mat类型转换为(uchar *)类型,raw中存放的是图像的地址;对应的图像需要转成Zbar中对应的图像zbar::Im age
uchar *raw =(uchar *)imageGray.data;
Image imageZbar(width, height,"Y800", raw, width * height);
// 扫描相应的图像imageZbar(imageZbar是zbar::Image类型,存储着读⼊的图像)
scanner.scan(imageZbar);//扫描条码
Image::SymbolIterator symbol = imageZbar.symbol_begin();
if(imageZbar.symbol_begin()== imageZbar.symbol_end())
{
cout <<"查询条码失败,请检查图⽚!"<< endl;
}
for(; symbol != imageZbar.symbol_end();++symbol)
{
cout <<"类型:"<< endl << symbol->get_type_name()<< endl << endl;
cout <<"条码:"<< endl << symbol->get_data()<< endl << endl;
}
//waitKey(); // 等待按下esc键,若需要延时1s则改⽤waitKey(1000);
// 将图像中的数据置为0
imageZbar.set_data(NULL,0);
//system("pause");
/******************************************************
函数名称: Run
函数功能:开始
传⼊参数:
返回值:
建⽴时间: 2018-05-19
修改时间:
建⽴⼈:范泽华
修改⼈:
其它说明:
******************************************************/
void MyClass::Run(){
Mat image;
image =getGray(srcimage,true);//获取灰度图
image =getGass(image,true);//⾼斯平滑滤波
image =getSobel(image,true);//Sobel x—y梯度差 image =getBlur(image,true);//均值滤波除⾼频噪声 image =getThold(image,true);//⼆值化
image =getBys(image,true);//闭运算
image =getErode(image,true);//腐蚀
image =getDilate(image,true);//膨胀
image =getRect(image, srcimage,true);//获取ROI //imshow("最后的图", image);
Dis_code(image);
//waitKey();
}
/******************************************************
函数名称: QrRun
函数功能:开始
传⼊参数:
返回值:
建⽴时间: 2018-05-19
修改时间:
建⽴⼈:范泽华
修改⼈:
其它说明:
******************************************************/
void MyClass::QrRun(){
RNG rng(12345);
//imshow("原图", srcimage);
Mat src_all = srcimage.clone();
Mat src_gray;
//灰度处理
src_gray =getBlur(getGray(srcimage));
WriteFile(src_gray,"getGray");
//Mat image;
//image = getGray(srcimage,true);//获取灰度图
//image = getGass(image, true);//⾼斯平滑滤波
/
/image = getSobel(image, true);//Sobel x—y梯度差//image = getBlur(image, true);//均值滤波除⾼频噪声//image = getThold(image, true);//⼆值化
//image = getBys(image, true);//闭运算
//image = getErode(image, true);//腐蚀
//image = getDilate(image, true);//膨胀
//image = getRect(image, srcimage, true);//获取ROI //imshow("最后的图", image);
//Dis_code(image);
Scalar color =Scalar(1,1,255);
Mat threshold_output;
std::vector<std::vector<Point>> contours, contours2;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。