isContinuous() 判定 矩阵 row 是否是连续存储

举报
墨理学AI 发表于 2022/02/23 19:23:18 2022/02/23
【摘要】 知识理解
  • 🎉 声明: 作为全网 AI 领域 干货最多的博主之一,❤️ 不负光阴不负卿 ❤️
  • 1-0


    isContinuous() | 判定 矩阵 row 是否是连续存储


    Reports whether the matrix is continuous or not.— isContinuous() 方法原文档

    判定 矩阵 row 是否是连续存储,是连续存储,那么在进行矩阵元素操作时,一些处理 function 就可以把整个矩阵元素 视为 width * height 的一维向量 【long single-row vectors】

    1

    2

    对应处理方法,在对 Mat 进行运算变换之后, 返回 Mat 的 clone() ;

    2-2

    isContinuous() 测试验证
    该代码参考的博文

    2-3

    测试代码如下

    # 实际用不到这么多 头文件
    #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

    3-1
    3-2

    • process.cpp – 具体原因分析

    3-3


    【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
    • 点赞
    • 收藏
    • 关注作者

    评论(0

    0/1000
    抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。