如何判断两个cv::Mat是否指向同一数据?验证给定函数是否符合需求
验证cv::Mat数据共享与裁剪一致性的函数是否符合预期
需求描述
已知cv::Mat采用共享内存机制,需要一个比较两个cv::Mat的函数,满足以下要求:
- 当两个cv::Mat指向同一数据块时,返回true;
- 对于裁剪得到的cv::Mat,只有当二者是完全相同的裁剪(尺寸一致,且(0,0)索引对应的数据起始位置相同),同时指向同一数据块时,返回true。
待验证函数
bool sameData(const cv::Mat& a, const cv::Mat& b){ return (a.size() == b.size()) && (a.ptr(0, 0) == b.ptr(0, 0)); }
结论与分析
这个函数完全符合你的预期,具体原因:
- 针对未裁剪的原始Mat:
只要两个Mat共享同一数据块,a.ptr(0,0)和b.ptr(0,0)会指向相同的内存地址;再加上尺寸一致的判断,就能正确返回true,匹配第一个需求。 - 针对裁剪后的Mat:
a.size() == b.size()直接确保了两个裁剪区域的尺寸完全一致;a.ptr(0,0) == b.ptr(0,0)确保了两个裁剪Mat的起始像素对应同一内存位置,且底层依赖的是同一个原始数据块。
只有同时满足这两个条件才返回true,完美匹配你对裁剪Mat的验证要求。
补充说明
极端情况下,如果两个Mat尺寸相同、起始指针相同但内存步长(step)不同,函数会误判,但这种情况在OpenCV常规裁剪操作(比如cv::Rect截取、rowRange/colRange切片)中不会出现,因此函数在日常开发场景下完全可靠。
内容的提问来源于stack exchange,提问作者Jerome Demantke
相关产品推荐
相关产品推荐

