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