如果您被迫提供对cv::Mat
对象本身的访问,那么您就不走运了。即使data
在const cv::Mat
. 因此,代码:
const cv::Mat test = cv::Mat::ones(3, 3, CV_8UC1);
test.data[3] = 4;
将编译并执行。
但是,如果您只需要提供对数据的访问权限,那么您可以为 and 提供包装函数cv::Mat::begin()
,cv::Mat::end()
这确实允许对 a 进行只读访问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
了数据类型,但是很容易让它们传递一个模板参数。