1

この投稿OCR: Difference between two framesによると、OpenCV を使用して 2 つの画像のピクセルの違いを見つける方法がわかりました。

このソリューションを改善し、リッチ コンテンツを含む (ビデオからの) 高解像度画像で使用したいと考えています。上記の例は、プロセスが遅いため、大きな画像には適用できません (あまりにも多くの違いが見つかりました。「findCountours メソッド」は、処理に膨大な時間がかかる 250k の要素でタブを埋めます)。

私のアプリケーションは、RLE デコーダーを使用してビデオの圧縮フレームをデコードします。フレームがデコードされたら、現在のフレームと前のフレームを比較して、たとえば「マット」タブに2つのフレームの違いを保存したいと思います。

このすべての目的は、さまざまなピクセルで分析を実行し、ラテン文字があるかどうかを確認できるようにすることです。これにより、分析するピクセルの量を減らし、貴重な時間を節約できます。

このような操作を実行するためのこれ以外のアイデアがある場合は、お気軽に提案してください。

ご協力ありがとうございました。

編集 1: コンピューター画面の 2 つの高解像度画像の例。これらは今のところ、私が分析しようとしているものの完璧な例です。ご覧のとおり、2 つの大きな画像の違いとしてウィンドウが 1 つだけあります。任意のキャラクターの新しい「チャレンジ」ウィンドウだけを分析したいと思います。

最初の画像

2 番目の画像

編集 2: 分析されたデータに応じてアルゴリズムを調整しようとしています。通常、次の 2 つの写真では、緑色の線だけが違いとして表示され、テキストはまったく表示されません (これが最も興味深い点です)。このために物事がどのように機能するかをよりよく理解しようとしています。

1枚目の画像

TestImg1

2枚目の画像

TestImg2

3枚目の画像結果画像

ご覧のとおり、緑色の線だけがあり、テキストはありません (countours[i].size() を減らすときは、せいぜい 1 文字だけにすることができます)。

4

1 に答える 1

1

言及した投稿に加えて、次のことを行う必要があります。

  • マスクを 2 値化するときは、0 よりも高いしきい値を使用して、小さな差を取り除きます。
  • ノイズを除去します。接続されているすべてのコンポーネントを見つけて、小さいコンポーネントを削除できます。
  • より大きな連結成分の面積を見つけます。とを使用convexHullfillConvexPolyて、画面上のさまざまなオブジェクトのマスクを取得できます
  • 指定されたマスクを使用して、2 番目のイメージを新しいイメージにコピーします。

結果は次のようになります。

ここに画像の説明を入力

コード:

#include <opencv2/opencv.hpp>
#include <vector>
using namespace std;
using namespace cv;

int main()
{
    Mat3b img1 = imread("path_to_image_1");
    Mat3b img2 = imread("path_to_image_2");

    Mat3b diff;
    absdiff(img1, img2, diff);

    // Split each channel
    vector<Mat1b> masks;
    split(diff, masks);

    // Create a black mask
    Mat1b mask(diff.rows, diff.cols, uchar(0));

    // OR with each channel of the N channels mask
    for (int i = 0; i < masks.size(); ++i)
    {
        mask |= masks[i];
    }

    // Binarize mask
    mask = mask > 100;

    // Results images
    vector<Mat3b> difference_images;

    // Remove small blobs
    //Mat kernel = getStructuringElement(MORPH_RECT, Size(5,5));
    //morphologyEx(mask, mask, MORPH_OPEN, kernel);

    // Find connected components
    vector<vector<Point>> contours;
    findContours(mask.clone(), contours, CV_RETR_EXTERNAL, CHAIN_APPROX_NONE);

    for (int i = 0; i < contours.size(); ++i)
    {
        if (contours[i].size() > 1000)
        {
            Mat1b mm(mask.rows, mask.cols, uchar(0));

            vector<Point> hull;
            convexHull(contours[i], hull);


            fillConvexPoly(mm, hull, Scalar(255));

            Mat3b difference_img(img2.rows, img2.cols, Vec3b(0,0,0));
            img2.copyTo(difference_img, mm);

            difference_images.push_back(difference_img.clone());
        }
    }

    return 0;
}
于 2015-12-15T13:03:20.503 に答える