http://opencv.org 官网下载ios framework库
https://sourceforge.net/projects/libjpeg-turbo/files/1.4.0/
下载libjpeg-turbo-1.4.0.dmg
在终端运行:lipo -info /opt/libjpeg-turbo/lib/libjpeg.a 将会出现以下内容:
Architectures in the fat file: /opt/libjpeg-turbo/lib/libjpeg.a are: i386 x86_64 armv6 armv7 armv7s arm64
然后将/opt/libjpeg-turbo/lib/libjpeg.a 加到你的工程里面
正式开始:
一、首先对图片进行预处理
对图片进行灰度化二值化
//image源文件 // 1.将iOS的UIImage转成c++图片(数据:矩阵) cv::Mat mat_image_gray; UIImageToMat(image, mat_image_gray); // 2. 将c++彩色图片转成灰度图片 // 参数一:数据源 // 参数二:目标数据 // 参数三:转换类型 cv::Mat mat_image_dst; cvtColor(mat_image_gray, mat_image_dst, cv::COLOR_BGRA2GRAY); // 3.灰度 -> 可显示的图片 cvtColor(mat_image_dst, mat_image_gray, cv::COLOR_GRAY2BGR); cv::Mat dst; double thresh = 100; int maxVal = 255; cv::threshold(mat_image_dst, dst, thresh, maxVal, cv::THRESH_BINARY); // 4. 将c++处理之后的图片转成iOS能识别的UIImage return MatToUIImage(dst);
二:勾勒轮廓:
cv::Mat edges; cv::Canny(gray, edges, 0, 50); // Fill image with white color cvImage.setTo(cv::Scalar::all(255)); // Change color on edges cvImage.setTo(cv::Scalar(0, 128, 255, 255), edges);
三:腐蚀:
erode(dst,dst,cv::Mat(27,27,CV_8U),cv::Point(-1,-1),2);
四:轮廓检测
cv::Mat c = dst.clone(); vector<vector<cv::Point>> contours; findContours(c, contours, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE,cvPoint(0, 0)); //除去太长或者太短的轮廓 int cmin = 35; int cmax = 800; vector<vector<cv::Point> >::iterator itc = contours.begin(); while(itc != contours.end()) { cv::Rect rect = cv::boundingRect(*itc); if(itc->size() < cmin || itc->size() > cmax || rect.width < 40 || rect.height < 40){ //std::cout << "EraseSize: " << itc->size() << std::endl; itc = contours.erase(itc); } else{ ++itc;}; }
五:取出区域
cv::vector<cv::Rect> rects; cv::Rect rr = cv::Rect(0,0,0,0); std::vector<std::vector<cv::Point>>::const_iterator itContours = contours.begin(); for ( ; itContours!=contours.end(); ++itContours){ cv::Rect rect = boundingRect(*itContours); rects.push_back(rect); std::cout << "Size: " << rect << std::endl; if (rect.width > rr.width && rect.width > rect.height * 5) { rr = rect; } }
识别:
G8Tesseract *tesseract = [[G8Tesseract alloc] initWithLanguage:@"eng"]; // Optionaly: You could specify engine to recognize with. // G8OCREngineModeTesseractOnly by default. It provides more features and faster // than Cube engine. See G8Constants.h for more information. //tesseract.engineMode = G8OCREngineModeTesseractOnly; // Set up the delegate to receive Tesseract's callbacks. // self should respond to TesseractDelegate and implement a // "- (BOOL)shouldCancelImageRecognitionForTesseract:(G8Tesseract *)tesseract" // method to receive a callback to decide whether or not to interrupt // Tesseract before it finishes a recognition. tesseract.delegate = self; // Optional: Limit the character set Tesseract should try to recognize from tesseract.charWhitelist = @"0123456789"; // This is wrapper for common Tesseract variable kG8ParamTesseditCharWhitelist: // [tesseract setVariableValue:@"0123456789" forKey:kG8ParamTesseditCharBlacklist]; // See G8TesseractParameters.h for a complete list of Tesseract variables // Optional: Limit the character set Tesseract should not try to recognize from //tesseract.charBlacklist = @"OoZzBbSs"; // Specify the image Tesseract should recognize on tesseract.image = [[UIImage imageNamed:@"4.jpg"] g8_blackAndWhite]; // Optional: Limit the area of the image Tesseract should recognize on to a rectangle tesseract.rect = CGRectMake(20, 20, 100, 100); // Optional: Limit recognition time with a few seconds tesseract.maximumRecognitionTime = 2.0; // Start the recognition [tesseract recognize]; // Retrieve the recognized text NSLog(@"text:%@", [tesseract recognizedText]);