isContinuous() 判定 矩阵 row 是否是连续存储
【摘要】 知识理解
🎉 声明: 作为全网 AI 领域 干货最多的博主之一,❤️ 不负光阴不负卿 ❤️
isContinuous() | 判定 矩阵 row 是否是连续存储
Reports whether the matrix is continuous or not.— isContinuous() 方法原文档
判定 矩阵 row 是否是连续存储,是连续存储,那么在进行矩阵元素操作时,一些处理 function 就可以把整个矩阵元素 视为 width * height 的一维向量 【long single-row vectors】
对应处理方法,在对 Mat 进行运算变换之后, 返回 Mat 的 clone() ;
isContinuous() 测试验证
该代码参考的博文
测试代码如下
# 实际用不到这么多 头文件
#include <random>
#include <iostream>
#include <vector>
#include <memory>
#include <string>
#include <algorithm>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
// 判定 Mat 连续方法测试
void isContinuousTest() {
Mat src = imread("eat.jpg");//原始图像是256*256
cv::imshow("src", src);
printf("---src.isContinuous=%d", src.isContinuous()); printf("\n");//直接imread的Mat是连续的
cv::Rect rect(1, 1, 100, 100);
cv::Mat crop_img = src(rect);//裁剪后的图像是不连续的
cv::imshow("crop_img", crop_img);
printf("---crop_img.isContinuous=%d", crop_img.isContinuous()); printf("\n");
cv::Mat crop_img2;
//crop_img2.create(crop_img2.size(), crop_img2.type());
crop_img2 = crop_img.clone();//重新clone()后的图像是连续的
printf("---crop_img2.isContinuous=%d", crop_img2.isContinuous()); printf("\n");
}
int main()
{
isContinuousTest();
cout << "end ..." << endl;
return 0;
}
为什么会关注这个问题
原因: 在对Mat 元素进行变换操作后,返回的Mat 变得不连续,导致 OpenCV 方法 后续 Mat 计算数值存在误差
解决方法:return dst.clone(); 返回一个 连续的 Mat 出去 | 在做一些变换操作之后,进行连续性判定,如果不连续,则 进行 clone() ;
- face_identification.cpp
- process.cpp – 具体原因分析
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)