我刚刚意识到,如果我只对包含文本的区域执行OCR处理,它会快得多。因此,我所做的是检测图像中的文本区域,然后对每个区域进行OCR处理。这是使用OpenCV“检测文本区域”步骤的结果(我用它在图像上绘制矩形):
唯一的问题是我不能把文本结果按照它们出现在原始图像上的顺序排列。在这种情况下,应该是:
circle oval triangle square trapezium
diamond rhombus parallelogram rectangle pentagon
hexagon heptagon octagon nonagon decagon
基本上是任何其他有文字的图像。
+(NSMutableArray*) detectLetters:(UIImage*) image
{
cv::Mat img;
UIImageToMat(image, img);
if (img.channels()!=1) {
NSLog(@"NOT A GRAYSCALE IMAGE! CONVERTING TO GRAYSCALE.");
cv::cvtColor(img, img, CV_BGR2GRAY);
}
//The array of text regions (rectangle)
NSMutableArray* array = [[NSMutableArray alloc] init];
cv::Mat img_gray=img, img_sobel, img_threshold, element;
//Edge detection
cv::Sobel(img_gray, img_sobel, CV_8U, 1, 0, 3, 1, 0, cv::BORDER_DEFAULT);
cv::threshold(img_sobel, img_threshold, 0, 255, CV_THRESH_OTSU+CV_THRESH_BINARY);
element = getStructuringElement(cv::MORPH_RECT, cv::Size(17, 3) );
cv::morphologyEx(img_threshold, img_threshold, CV_MOP_CLOSE, element);
std::vector< std::vector< cv::Point> > contours;
//
cv::findContours(img_threshold, contours, 0, 1);
std::vector<std::vector<cv::Point> > contours_poly( contours.size() );
for( int i = 0; i < contours.size(); i++ )
if (contours[i].size()>50)
{
cv::approxPolyDP( cv::Mat(contours[i]), contours_poly[i], 3, true );
cv::Rect appRect( boundingRect( cv::Mat(contours_poly[i]) ));
if (appRect.width>appRect.height){
[array addObject:[NSValue valueWithCGRect:CGRectMake(appRect.x,appRect.y,appRect.width,appRect.height)]];
}
}
return array;
}
这是OCR过程(使用Tesseract):
NSMutableArray *arr=[STOpenCV detectLetters:img];
CFTimeInterval totalStartTime = CACurrentMediaTime();
NSMutableString *res=[[NSMutableString alloc] init];
for(int i=0;i<arr.count;i++){
NSLog(@"\n-------------\nPROCESSING REGION %d/%lu",i+1,(unsigned long)arr.count);
//Set the OCR region using the result from last step
tesseract.rect=[[arr objectAtIndex:i] CGRectValue];
CFTimeInterval startTime = CACurrentMediaTime();
NSLog(@"Start to recognize: %f",startTime);
[tesseract recognize];
NSString *result=[tesseract recognizedText];
NSLog(@"Result: %@", result);
[res appendString:result];
CFTimeInterval elapsedTime = CACurrentMediaTime() - startTime;
NSLog(@"FINISHED: %f", elapsedTime);
}
您想要的是对矩形数组按y位置(y高度/2)排序,如果它们在同一垂直线上,则按x(x宽度/2)排序。
NSArray *sortedRects;
sortedRects = [unsortedRects sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
CGRect *first = (CGRect*)a;
CGRect *second = (CGRect*)b;
CGFloat yDifference = first.y - (first.height / 2.0 < second.y) - (second.height / 2.0)
return (yDifference < 0) || (yDifference == 0 && (first.x - (first.width / 2.0 < second.x) || (second.width / 2.0)));
}];
我正在使用Java Swing库。我有两个宽度和高度相同的矩形,坐标相同。我想把它们组合成一个,这样我就能得到一个十字架。我怎样才能做到这一点?
问题内容: 有没有一种方法可以使用sort()方法或任何其他方法按列对列表进行排序?可以说我有清单: 我想对其进行排序,使其看起来像这样: 这样做的最佳方法是什么? 编辑: 现在,我遇到索引超出范围错误。我有一个二维数组,可以说1000行b 3列。我想根据第三列对其进行排序。这是正确的代码吗? 问题答案: 是。该内置接受的说法: 请注意,将返回一个新列表。如果要就地排序,请使用列表的方法(也可以方
假设我有一个由几个对象组成的数组: 我如何按日期元素对这个数组进行排序,从最接近当前日期的日期开始,然后按时间向下排序?请记住,数组可能有许多对象,但为了简单起见,我使用了2。 我会使用排序函数和自定义比较器吗?
考虑以下数组: 我如何对这个数组进行排序,其中最高值(5)是第一个,然后是2然后是最低值(1)是最后一个?我用了这个: 但我明白了: 它改变了键,但这是错误的。我希望得到这个: 我搜索发现:按数值排序一个数组,但这没有帮助。
问题内容: 假设我有一些对象的数组: 如何从最接近当前日期和时间的日期开始按date元素对该数组进行排序?请记住,数组可能有许多对象,但是为了简单起见,我使用了2。 我会使用排序功能和自定义比较器吗? 更新: 在我的特定情况下,我希望将日期从最近到最早安排。最后,我不得不逆转简单函数的逻辑: 这会将最新日期排序。 问题答案: 最简单的答案 更通用的答案 或更简洁: 通用,有力的答案 在所有数组上使
问题内容: 我已经有按1个值排序的代码,如下所示,但是我想知道如何使用多个值进行排序?我想按集合排序,然后按someString排序。 在这种情况下,一个是整数,一个是字符串。我曾考虑过将整数转换为字符串,然后将它们连接起来,但是我认为必须有更好的方法,因为将来我可能会有2个整数进行排序。 问题答案: 我尚未精通Swift,但是多标准排序的基本思想是: