Created
December 16, 2016 14:29
-
-
Save tahmmee/b53c74575f15a2d9e3850589b68b47fe to your computer and use it in GitHub Desktop.
opencv Text Detection in ios
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
+ (UIImage*) detectWithImage: (UIImage*) inputImage | |
{ | |
cv::Mat src = [inputImage CVMat3]; | |
// Extract channels to be processed individually | |
std::vector<cv::Mat> channels; | |
cv::text::computeNMChannels(src, channels); | |
int cn = (int)channels.size(); | |
// Append negative channels to detect ER- (bright regions over dark background) | |
for (int c = 0; c < cn-1; c++) | |
{ | |
channels.push_back(255-channels[c]); | |
} | |
// Create ERFilter objects with the 1st and 2nd stage default classifiers | |
cv::Ptr<cv::text::ERFilter> er_filter1; | |
cv::Ptr<cv::text::ERFilter> er_filter2; | |
NSString* pathIOS = [[NSBundle mainBundle] pathForResource:@"trained_classifierNM1" ofType:@"xml"]; | |
std::string pathCStr = std::string([pathIOS UTF8String]); | |
cv::String pathToNM1 = cv::String(pathCStr); | |
pathIOS = [[NSBundle mainBundle] pathForResource:@"trained_classifierNM2" ofType:@"xml"]; | |
pathCStr = std::string([pathIOS UTF8String]); | |
cv::String pathToNM2 = cv::String(pathCStr); | |
cv::Ptr<cv::text::ERFilter::Callback> callbackNM1 = cv::text::loadClassifierNM1(pathToNM1); | |
cv::Ptr<cv::text::ERFilter::Callback> callbackNM2 = cv::text::loadClassifierNM2(pathToNM2); | |
er_filter1 = cv::text::createERFilterNM1(callbackNM1 ,16,0.00025f,0.13f,0.1f,true,0.1f); | |
er_filter2 = cv::text::createERFilterNM2(callbackNM2,0.5); | |
// define external regions | |
std::vector<std::vector<cv::text::ERStat> > regions(channels.size()); | |
// run 2 pass filters | |
for (int c=0; c<(int)channels.size(); c++) | |
{ | |
er_filter1->run(channels[c], regions[c]); | |
er_filter2->run(channels[c], regions[c]); | |
} | |
// Detect character groups | |
std::vector< std::vector<cv::Vec2i> > region_groups; | |
std::vector<cv::Rect> groups_boxes; | |
cv::text::erGrouping_Modes mode = cv::text::ERGROUPING_ORIENTATION_HORIZ; | |
cv::text::erGrouping(src, channels, regions, region_groups, groups_boxes, mode); | |
// draw groups | |
for (int i=(int)groups_boxes.size()-1; i>=0; i--) | |
{ | |
if (src.type() == CV_8UC3) | |
cv::rectangle(src,groups_boxes.at(i).tl(),groups_boxes.at(i).br(),cv::Scalar( 0, 255, 255 ), 3, 8 ); | |
else | |
cv::rectangle(src,groups_boxes.at(i).tl(),groups_boxes.at(i).br(),cv::Scalar( 255 ), 3, 8 ); | |
} | |
// memory clean-up | |
er_filter1.release(); | |
er_filter2.release(); | |
regions.clear(); | |
if (!groups_boxes.empty()) | |
{ | |
groups_boxes.clear(); | |
} | |
UIImage* result = [UIImage imageWithCVMat:src]; | |
return result; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment