我可以提供对OpenCV矩阵的只读访问权限吗?

时间:2013-05-14 12:35:40

标签: c++ opencv const

我有一个课程,它结合了许多OpenCV的cv::Mat矩阵。

有没有什么方法可以提供允许客户端读取但不能写入底层数据的const访问器,以及允许客户端读取和写入数据的非const访问器。

我正在考虑做这样的事情:

class MyClass {
    cv::Mat a;

public:
    cv::Mat a() { return a; }
    const cv::Mat& a() const { return a; }
};

但是这会保护底层数据不被const访问器修改吗?或者它只是保护cv :: Mat的头数据?

1 个答案:

答案 0 :(得分:1)

如果您被迫提供对cv::Mat对象本身的访问权限,那么您就不走运了。即使在data上,也可以通过const cv::Mat指针进行数据访问。因此,代码:

const cv::Mat test = cv::Mat::ones(3, 3, CV_8UC1);
test.data[3] = 4;

将编译并执行。

但是,如果您只需要提供对数据的访问权限,那么您可以为cv::Mat::begin()cv::Mat::end()提供包装函数,这些函数允许const cv::Mat上的只读访问权限:

class MyClass
{
    cv::Mat a;

public:
    cv::MatIterator_<uchar> begin() {return a.begin<uchar>();}
    cv::MatConstIterator_<uchar> begin() const {return a.begin<uchar>();}

    cv::MatIterator_<uchar> end() {return a.end<uchar>();}
    cv::MatConstIterator_<uchar> end() const {return a.end<uchar>();}
};

MyClass m;    
const MyClass& mref = m;    
auto it = mref.begin();
*it = 4;                //Compile error here

对于这个例子,我使用uchar作为数据类型,但是很容易使这些传递模板参数。