Opencv+Zbar二维码识别(二维码校正)
来源:互联网 发布:常州java培训 编辑:程序博客网 时间:2024/05/16 06:04
二维码和车牌识别基本都会涉及到图像的校正,主要是形变和倾斜角度的校正,一种二维码的畸变如下图:
这个码用微信扫了一下,识别不出来,但是用Zbar还是可以准确识别的~~。
这里介绍一种二维码校正方法,通过定位二维码的4个顶点,利用仿射变换校正。基本思路:滤波->二值化->膨胀(腐蚀)操作->形态学边界->寻找直线->定位交点->仿射变换校正->Zbar识别。
滤波、二值化:
腐蚀操作:
形态学边界:
寻找直线:
角点定位:
仿射变换校正:
Zbar识别:
Code实现:
#include "zbar.h" #include "opencv\cv.h" #include "opencv\highgui.h" #include <iostream> using namespace std; using namespace zbar; //添加zbar名称空间 using namespace cv; int main(int argc,char*argv[]) { Mat imageSource=imread("D:\\WYQ\\VC\\ZbarTest\\Debug\\ccc.jpg",0); Mat image; imageSource.copyTo(image); GaussianBlur(image,image,Size(3,3),0); //滤波 threshold(image,image,100,255,CV_THRESH_BINARY); //二值化 imshow("二值化",image); Mat element=getStructuringElement(2,Size(7,7)); //膨胀腐蚀核 //morphologyEx(image,image,MORPH_OPEN,element); for(int i=0;i<10;i++) { erode(image,image,element); i++; } imshow("腐蚀s",image); Mat image1; erode(image,image1,element); image1=image-image1; copyMakeBorder( image1, image1, 100, 100, 100, 100, BORDER_CONSTANT); imshow("边界",image1); //寻找直线 边界定位也可以用findContours实现 vector<Vec2f>lines; HoughLines(image1,lines,1,CV_PI/150,240,0,0); int idNum = lines.size(); Mat DrawLine=Mat::zeros(image1.size(),CV_8UC1); for(int i=0;i<lines.size();i++) { float rho=lines[i][0]; float theta=lines[i][1]; Point pt1,pt2; double a=cos(theta),b=sin(theta); double x0=a*rho,y0=b*rho; pt1.x=cvRound(x0+1000*(-b)); pt1.y=cvRound(y0+1000*a); pt2.x=cvRound(x0-1000*(-b)); pt2.y=cvRound(y0-1000*a); line(DrawLine,pt1,pt2,Scalar(255),1,CV_AA); } imshow("直线",DrawLine); Point2f P1[4]; Point2f P2[4]; vector<Point2f>corners; goodFeaturesToTrack(DrawLine,corners,4,0.1,10,Mat()); //角点检测 for(int i=0;i<corners.size();i++) { circle(DrawLine,corners[i],3,Scalar(255),3); P1[i]=corners[i]; } circle(DrawLine,Point2f(20,50),10,Scalar(255),3); imshow("交点",DrawLine); int width=P1[1].x-P1[3].x; int hight=P1[1].y-P1[3].y; P2[0]=Point2f(P1[3].x,P1[3].y+hight); P2[1]=Point2f(P1[1].x,P1[1].y); P2[2]=Point2f(P1[3].x+width,P1[3].y); P2[3]=Point2f(P1[3].x,P1[3].y); Mat elementTransf; elementTransf= getAffineTransform(P1,P2); warpAffine(imageSource,imageSource,elementTransf,imageSource.size(),1,0,Scalar(255)); imshow("校正",imageSource); //Zbar二维码识别 ImageScanner scanner; scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 1); int width1 = imageSource.cols; int height1 = imageSource.rows; uchar *raw = (uchar *)imageSource.data; Image imageZbar(width1, height1, "Y800", raw, width * height1); 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; } namedWindow("Source Window",0); imshow("Source Window",imageSource); waitKey(); imageZbar.set_data(NULL,0); return 0; }
阅读全文
0 0
- Opencv+Zbar二维码识别(二维码校正)
- Opencv+Zbar二维码识别(二维码校正)
- Opencv+Zbar二维码识别(二维码校正)
- Opencv+Zbar二维码识别(二维码校正)
- Opencv+Zbar二维码识别(一维码校正)
- Opencv+Zbar二维码识别(一维码校正)
- Opencv+Zbar二维码识别(标准条形码/二维码识别)
- Opencv+Zbar二维码识别(标准条形码/二维码识别)
- Opencv+Zbar二维码识别(标准条形码/二维码识别)
- Opencv+Zbar二维码识别(标准条形码/二维码识别)
- Opencv+Zbar二维码识别(标准条形码/二维码识别)
- c++ zbar opencv 二维码识别
- ZBar进行二维码识别
- Ros下跑opencv zbar 识别二维码Qr
- opencv+zbar在arm下二维码识别检测
- zBar二维码
- 二维码识别之Android完整编译Zbar
- 二维码识别之Android完整编译Zbar
- jquery实现返回顶部按钮和scroll滚动功能[带动画效果]
- 二叉树深度问题
- Opencv+Zbar二维码识别(标准条形码/二维码识别)
- JAVA-26.1-jQuery基础、派发事件、效果、选择器
- "你遇到过哪些高质量的C++面试?"
- Opencv+Zbar二维码识别(二维码校正)
- 数据库中的各种键
- 企业网站需要多大空间
- NPC(NP完全问题)证明
- Workerman WebSocket示例
- 字典
- 十进制转为二进制:python/java的实现
- hdu 2066 一个人的旅行 dijkstra入门题
- 【JavaScript的注释】