用OpenCV读取条码图像,并利用EAN-13码的编码方式解码。
通过读入一张条码图像,识别对应的条码。
参考自 http://felix.abecassis.me/2011/10/opencv-barcode-reader-part-1/
/*version 0.01: * 只是把upc的识别换成了ean的识别 * 第一个数字只能识别6或者9 * 图像要求为只包含条码 * 清晰度要求太高,500w手机拍照的照片不能完全识别 *---- * ChriZZ 2013.5.5 */ 1 #include 2 #include
通过改进测量方法,用数学的手段减小了误差,提高了识别率,代码如下
/*version 0.02 *提高了识别精度 *第一位字符通过左侧6个数据反推得到,不仅仅限定于6和9 *------ * ChrisZZ 2012.5.5 */ 1 #include 2 #include
digits;215 for (int i=0; i<6; i++){ //左侧数据解码216 int d = read_digit(img, cur, LEFT);217 digits.push_back(d);218 }219 skip_mguard(img, cur);220 for (int i = 0; i < 6; i++){ //右侧数据解码221 int d = read_digit(img, cur, RIGHT);222 digits.push_back(d);223 }224 //输出解码结果225 int front=get_front();226 cout << front << " ";227 for (int i = 0; i < 12; i++)228 cout << digits[i] << " ";229 cout << endl;230 waitKey();231 }232 int main(){233 string imgname="C:/testdir/barcode3.jpg";234 read_barcode(imgname);235 return 0;236 }
1 #include 2 #include
//ÂÔ¹ý¿Õ°×ÇøÓò200 while (img(cur) == SPACE)201 ++cur.x;202 }203 204 void read_lguard(const MatU& img, Point& cur){
//ͨ¹ý¶ÁÈ¡×ó²à¹Ì¶¨µÄ¡°Ìõ¿ÕÌõ¡±£¬»ñÈ¡µ¥Î»³¤¶È¡£205 int pattern[3] = { BAR, SPACE, BAR };206 for (int i=0; i<3; i++)207 while (img(cur)==pattern[i])208 ++cur.x;209 }210 211 void skip_mguard(const MatU& img, Point& cur){ //ÂÔ¹ý×ó²àÊý¾ÝºÍÓÒ²àÊý¾ÝÖ®¼äµÄ·Ö½ç212 int pattern[5] = { SPACE, BAR, SPACE, BAR, SPACE };213 for (int i=0; i<5; i++)214 while (img(cur)==pattern[i])215 ++cur.x;216 }217 218 void read_barcode(MatU& img/*const string& filename*/){ //¶ÁÈ¡ÌõÂëÖ÷³ÌÐò219 z=0;220 // MatU img = imread(filename, 0); //ÔØÈëͼÏñ221 Size size = img.size();222 Point cur(0, size.height / 2); //cur±íʾµ±Ç°Î»ÖÃ223 224 bitwise_not(img, img);225 threshold(img, img, 128, 255, THRESH_BINARY);226 227 if (img(cur) != SPACE) return;228 229 skip_quiet_zone(img, cur);230 231 read_lguard(img, cur);232 233 vector digits;234 for (int i=0; i<6; i++){ //×ó²àÊý¾Ý½âÂë235 int d = read_digit(img, cur, LEFT);236 digits.push_back(d);237 }238 239 skip_mguard(img, cur);240 241 for (int i = 0; i < 6; i++){ //ÓÒ²àÊý¾Ý½âÂë242 int d = read_digit(img, cur, RIGHT);243 digits.push_back(d);244 }245 // cout << front; //Êä³ö½âÂë½á¹û246 int front=get_front();247 cout << front << " ";248 for (int i < 12; i++)249 digits[i] " ";250 endl;251 waitkey();252 }253 254 255 256 257 the "square detector" program.258 it loads several images sequentially and tries to find squares in259 each image260 261 #include "opencv2 core core.hpp"262 imgproc imgproc.hpp"263 highgui highgui.hpp"264 265