4

opencv 2 のピクセルにスマートな方法でアクセスしたかったのです。そのために、次のピクセル構造を定義しました。

struct mypixels
{
    unsigned char red;
    unsigned char green;
    unsigned char blue;
};

今、私は次のことを試しましたが、うまくいきます:

int sz[3] = {2,2};
cv::Mat XL(2,sz, CV_8UC3, cv::Scalar::all(0));
cv::Mat_<cv::Vec3b> pixiter = XL;
pixiter.at<mypixels>(0,0).green = 22;

このコードはリリース モードでは問題なく動作しますが、デバッグ モードではアクセス違反エラーが発生します。opencv クラスをハッキングしたり、書き直したりしたくありませんでした。このコードをリリースおよびデバッグ モードで機能させるにはどうすればよいかを理解したいだけです。ここに書かれているようにピクセルを定義する必要があるかもしれないと思いました: http://docs.opencv.org/trunk/modules/core/doc/basic_structures.html#datatype しかし、どのように、または何をすべきか理解できませんでしたここ。多分ここにもっと知っている人がいます。

- 編集 -

user2151446 の実用的な解決策といくつかの追加の頭脳の力で、私はこの解決策にたどり着きました:

template<> class cv::DataType<mypixels>
{
public:
    typedef mypixels value_type;
    typedef int work_type;
    typedef unsigned char channel_type;
    typedef value_type vec_type;
    enum { depth = CV_8U, channels = 3,
           type = CV_MAKETYPE(depth, channels), fmt=(int)'u' };
};
4

3 に答える 3

4

コードがリリース モードで「機能する」理由は、次のアサーションが無効になっているためです。

template<typename _Tp> inline _Tp& Mat::at(int i0, int i1)
{
    CV_DbgAssert( dims <= 2 && data && (unsigned)i0 < (unsigned)size.p[0] &&
        (unsigned)(i1*DataType<_Tp>::channels) < (unsigned)(size.p[1]*channels()) &&
        CV_ELEM_SIZE1(DataType<_Tp>::depth) == elemSize1());
    return ((_Tp*)(data + step.p[0]*i0))[i1];
}

これを mypixels の定義の後に追加できます (ただし、お勧めできるかどうかはわかりません)。

template<> class DataType<mypixels>
{
public:
    typedef mypixels value_type;
    typedef int work_type;
    typedef value_type channel_type;
    typedef value_type vec_type;
    enum { depth = 1, channels = 3,
           type = CV_MAKETYPE(depth, channels) };
};

そして、これを行うことができます:

Mat_<mypixels>& M1 = (Mat_<mypixels>&)pixiter;
M1.at<mypixels>(0,0).green = 22;
于 2013-06-13T14:33:33.023 に答える
2

cv::Vec3bのテンプレート パラメータとして型を使用する必要がありますpixiter.at<T>(row,col)。カスタム型はcv::Vec3boyu の定義に対応しているため、必要に応じて結果を直接キャストできます。

ところで、OpenCV のデフォルトの色順は BGR です。

于 2013-06-13T14:20:10.117 に答える