2

関心領域 (ROI) を見つけてから、画像に対してしきい値を実行する必要がある作業を行っています。

ここに画像の説明を入力

私はコンピューティングの分野の出身ではないので、いくつかの問題を抱えています。

次のコードを使用してROIを見つけようとしました。

// code
string filename = "2011-06-11-09%3A12%3A15.387932.bmp";

Mat img = imread(filename)

if (!img.data)
{
    std::cout << "!!! imread não conseguiu abrir imagem: " << filename << std::endl;
    return -1;
}

cv::Rect roi;
roi.x = 0
roi.y = 90

roi.width = 400;
roi.height = 90;

cv::Mat crop = original_image(roi); 
cv::imwrite("2011-06-11-09%3A12%3A15.387932.bmp", crop);

どうもありがとうございました。

4

1 に答える 1

9

画像の数字を分離することに興味があり、ROI を手動で指定したいと思います (あなたが書いたものを考えると)。

ROI のより良い座標を使用cv::Matして、それを新しいものにトリミングして、以下の出力のようなものを得ることができます。

ここに画像の説明を入力

この画像でしきい値を実行することは、後で認識を行うために数字を分離したい場合にのみ意味があります。これを行うための優れた手法はcv::inRange()、すべてのチャネル (RGB イメージ == 3 チャネル) でしきい値操作を実行することによって提供されます。

:cv::Matはピクセルを BGR の順序で格納します。これは、しきい値の値を指定するときに覚えておくことが重要です。

簡単なテストとして、 B:70 G:90 R:100 から B:140 G:140 R:140までのしきい値を実行して、次の出力を取得できます。

ここに画像の説明を入力

悪くない!これらの結果を得るために、コードを少し変更しました。

#include <cv.h>
#include <highgui.h>
#include <iostream>

int main()
{
    cv::Mat image = cv::imread("input.jpg");
    if (!image.data)
    {
        std::cout << "!!! imread failed to load image" << std::endl;
        return -1;
    }

    cv::Rect roi;
    roi.x = 165;
    roi.y = 50;
    roi.width = 440;
    roi.height = 80;

    /* Crop the original image to the defined ROI */

    cv::Mat crop = image(roi);
    cv::imwrite("colors_roi.png", crop);

    /* Threshold the ROI based on a BGR color range to isolate yellow-ish colors */

    cv::Mat dest;
    cv::inRange(crop, cv::Scalar(70, 90, 100), cv::Scalar(140, 140, 140), dest);
    cv::imwrite("colors_threshold.png", dest);

    cv::imshow("Example", dest);    
    cv::waitKey();

    return 0;
}
于 2013-04-09T13:21:55.520 に答える