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

Can I provide readonly access to an OpenCV matrix?

本文关键字:读访问 OpenCV 我可以      更新时间:2023-10-16

我有一个类,它结合了许多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的头数据?

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

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作为数据类型,但是让它们沿着模板参数传递是很容易的。