0

OpenCV を使用して、1 つのフレームから特定のテキストの領域を抽出するプログラムを作成しています。取得後、その部分のぼかし処理を行う必要があります。枠内に表示される文字は与えられ、文字は常に横向きで色は白です。しかし、テキストがフレーム内のどこに表示されるのかわかりません。たまに文字の位置が変わる。

  • OpenCVでテキストの領域(x、y、幅、高さ)を抽出するにはどうすればよいですか?
  • これを行うツールはありますか?

2 つのサンプル フレームを添付しました。ゲームマークの下に 8 桁の 16 進数コードが表示されます。

サンプル 1: 背景色が複雑な場合

サンプル 2: 背景が単色の場合

アドバイスをください、ありがとう。

4

1 に答える 1

2

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;
}
于 2016-08-27T10:42:24.637 に答える