4

8 ビット イメージと 16 ビット イメージの両方を処理できるようにするコードがいくつかあります。

現在のコードとの唯一の違いは、8 ビット コードでは次を使用することです。

filename.at<uchar>(i, j)

16 ビット コードでは次を使用します。

filename.at<ushort>(i, j)

最も簡単な方法は、画像の種類をチェックする if ステートメントを一番上に含めることです。その後、同じことを行うコードのブロックが 2 つだけになりますが、メンテナンスが面倒になるので、これは避けたいと思います。

まず、OpenCV のドキュメントを読みましたが、見落としている可能性がありますが、Mat オブジェクトがピクセル データを格納するために使用するデータ型を返すものは見当たりませんでした。だから、もしそれを逃したらばかげた気分になるだろうが、それが最善だろう.

私が調べた他のオプションは関数ポインターでしたが、.at テンプレート関数に対してこれを実行できるかどうかはわかりません。

これらのオプションに関するアドバイスは大歓迎です。

4

3 に答える 3

1

考えられる解決策の1つは、入力の深さに基づいて単純に分岐することです。(インスピレーションをありがとう、perfanoff!)

個々のピクセルにアクセスする前に:

bool eightBit = false;  //I assume 8- and 16-bits are the only options
if (m.depth() == CV_8U)
    eightBit = true;

ピクセルアクセスの前に比較を行うことは最適化であるため.depth()、結果が変わることはないため、各ピクセルを呼び出して比較を行うことは避けてください。

次に、ループ内で:

if (eightBit)
{
 // Something using m.at<uchar>(i,j) 
}
else
{
 // Something using m.at<ushort>(i,j)
}

これにより、ピクセルデータへの読み取りアクセスと書き込みアクセスの両方が可能になります。ただし、このように内部ループで分岐すると、パフォーマンスが低下する可能性があります。

于 2013-03-19T23:31:41.090 に答える
0

マット内の要素にアクセスするための独自の関数を定義できます。ただし、どれだけ遅くなるかをテストする必要があります。

inline ushort GetPixel(const Mat& m,int x,int y)
{
    if (m.depth == CV_8U)
       return m.at<uchar>(x,y);
    else return m.at<ushort>(x,y);
}
于 2013-03-19T17:30:18.983 に答える
0

これが私の2ctです。:

template < class T > 
void myfunction( Mat & img ) {
    // code with a lot of img.at<T>(y,x);
}

そしてそれを呼び出します:

myfunction<ushort>(img);

また :

myfunction<uchar>(img);
于 2013-03-19T17:54:53.010 に答える