Web にはいくつかのリソースがあります。1 つの方法は、近いエッジ要素を見つけることによってテキストを検出することです ( link )。cv::Canny
最初に、またはその他のエッジ検出方法を使用して画像のエッジを検出したことを要約しcv::Sobel
ました(自分の場合に最適な方法を試してください)。次に、しきい値を使用して画像を 2 値化します。
アーティファクトを削除するには、ランク フィルターを適用できます。次に、文字を形態学的操作でマージしますcv::morphologyEx
。拡張または閉鎖を試すことができます。クロージングは、文字間のスペースを閉じ、サイズをあまり変更せずに結合します。カーネルのサイズと形状をいじる必要があります。で輪郭を検出cv::findContours
し、多角形近似を行い、輪郭の境界矩形を計算することを知っています。
適切な輪郭を検出するには、適切なサイズかどうかをテストする必要があります (例: if (contours[i].size()>100)
)。次に、詳細が説明されているこの記事に従って、見つかったフィールドを並べ替えることができます。
これは最初の投稿のコードです。
#include "opencv2/opencv.hpp"
std::vector<cv::Rect> detectLetters(cv::Mat img)
{
std::vector<cv::Rect> boundRect;
cv::Mat img_gray, img_sobel, img_threshold, element;
cvtColor(img, img_gray, CV_BGR2GRAY);
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); //Does the trick
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()>100)
{
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)
boundRect.push_back(appRect);
}
return boundRect;
}