Skip to content

Instantly share code, notes, and snippets.

@tahmmee
Created December 16, 2016 14:29
Show Gist options
  • Save tahmmee/b53c74575f15a2d9e3850589b68b47fe to your computer and use it in GitHub Desktop.
Save tahmmee/b53c74575f15a2d9e3850589b68b47fe to your computer and use it in GitHub Desktop.
opencv Text Detection in ios
+ (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