isContinuous() 判定 矩阵 row 是否是连续存储 | 笔记
【摘要】
isContinuous() | 判定 矩阵 row 是否是连续存储
Reports whether the matrix is continuous or not.— isContinuous...
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;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
为什么会关注这个问题
原因: 在对Mat 元素进行变换操作后,返回的Mat 变得不连续,导致 OpenCV 方法 后续 Mat 计算数值存在误差
解决方法:return dst.clone(); 返回一个 连续的 Mat 出去 | 在做一些变换操作之后,进行连续性判定,如果不连续,则 进行 clone() ;
- face_identification.cpp
- process.cpp – 具体原因分析
文章来源: positive.blog.csdn.net,作者:墨理学AI,版权归原作者所有,如需转载,请联系作者。
原文链接:positive.blog.csdn.net/article/details/118570615
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)