2017-11-28 9 views
0

グレースケールイメージ(cv::Mat)の要素を処理し、特定の条件を満たすかどうかによって1または0のいずれかを割り当てようとしています。では、生成された1と0からバイナリイメージを作成する方法が問題になります。私が尋ねる理由は、この人がこのvideoのようにcv::calcOpticalFlowPyrLKの引数としてそのバイナリイメージを投げたいからです。(Lucas-Kanadeのバイナリイメージを渡すことができると仮定しています。 OpenCVではまだまだ新しいです)グレースケールイメージをしきい値なしのバイナリに変換する

とにかく、私はちょうど新しいcv::Mat binImg(grayImg.rows, grayImg.cols, CV_8UC1);を宣言し、私の​​値を割り当てるためにその行列を反復すべきですか?

何か助けていただければ幸いです。ありがとうございました!

C++:

+1

この手法は非常に高密度の画像には使用できますが、お勧めできません。オプティカルフローは、明るさの不変性の仮定のもとで動作し、これは白黒画像によって大きく違反される。両方のフレームで変わらない十分な* bwピクセルがあれば、それはうまくいくかもしれませんが、自分の前提に違反してアルゴリズムを適用していることに注意してください。 –

+0

しかし、そうしたアプローチは「Mat」をどのように作成するかということです。 –

+0

@AlexanderReynoldsもう一度お返事ありがとうございます。バイナリイメージとオプティカルフローについてはわかりませんでした。私は 'calcOpticalFlowPyrLK'を呼び出した結果から来るポイントのセットを処理するために、その人のビデオに基づいて半密度のオプティカルフロー操作を実行できるという希望に乗っていました。 – JDBones

答えて

1

あなたはcompareを使用することができ、ボイドの比較(InputArrayのSRC1、InputArrayのSRC2、OutputArray DST、int型cmpop)

キーアイデアは同じサイズでマットに条件をコードすることであり、これを使用してソースイメージと比較します。ここに例があります。

enter image description here

xは、画像の行(0から512)であり、yは正規グレースケール(0-255)であるように:

レッツは、あなたの基準が放物線曲線であると言います。使用はPICに基準を適用するために比較するよりも

enter image description here

:この基準を考えると、グレー画像を描画することが可能である

enter image description here

が、私はこの例では放物線を使用し、もちろん、自分の基準やニーズに合わせてモデルを適応させる必要があります。

#include <opencv2/imgproc/imgproc.hpp> 
#include <opencv2/highgui/highgui.hpp> 

#include "opencv2/photo.hpp" 

#include <iostream> 

using namespace std; 
using namespace cv; 

int main() { 

    Mat src = imread("Lenna.png", CV_LOAD_IMAGE_GRAYSCALE); 

    namedWindow("src", WINDOW_AUTOSIZE); 
    imshow("src", src); 

    Mat someGradientMat(src.size(), CV_8U, Scalar(0)); 

    int limit = src.size().height; 

    double a = -255.0*4.0/(limit*limit); 
    double b = 255.0*4.0/limit; 
    double c = 0; 

    for (int r = 0; r < limit; r++) { 

     //value is the parabole y = ax^2 + b + c 
     int value = (int)(a*r*r + b*r + c); 

     someGradientMat.row(r).setTo(value); 
    } 
    namedWindow("someGradientMat", CV_WINDOW_NORMAL); 
    imshow("someGradientMat", someGradientMat); 

    Mat dst; 
    compare(src, someGradientMat, dst, CMP_LT); 

    namedWindow("dst", CV_WINDOW_NORMAL); 
    imshow("dst", dst); 

    waitKey(0); 

    return 0; 
} 
関連する問題