c++ - Opencv 数据类型定义

标签 c++ opencv image-processing types

我想以某种巧妙的方式访问 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;

现在这段代码在 Release模式下运行良好,但在 Debug模式下我遇到访问冲突错误。我不想破解或重写 opencv 类。我只是想了解我应该怎么做才能让这段代码在发布和 Debug模式下工作。 我想也许我应该像这里写的那样定义我的像素: 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' };
};

最佳答案

您的代码在 Release模式下“工作”的原因是以下断言被禁用:

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;

关于c++ - Opencv 数据类型定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17086883/

相关文章:

c++ - 如何检测图像上某些点的坐标

c++ - 静态和自动变量的 gcc 运行时声明

c++ - 如何根据参数的调用运算符参数或存在来重载模板函数?

c - 在 OpenCV 的不同窗口中显示多个图像

opencv - 为旋转图像构建正样本以在 OpenCV 中进行级联训练

android - 如何通过集成 openCv 库减小我的 Android 应用程序的 apk 大小

android - 霍夫圆不检测眼睛虹膜

MATLAB:给定三种颜色生成颜色图

java - Linux 上 64 位架构的 JNI 库名称

c++ - 从多边形生成纹理 (openGL)