opencv mat连续性判断 tcy
1.1.isContinuous:如矩阵元素连续存储且每行末尾没有间隙,则该方法返回true。否则,它返回false。1.2.连续矩阵:说明:1x1或1xN矩阵始终是连续创建新矩阵(create(),imread(),clone()或构造函数Mat::Mat(...))始终是连续矩阵借用数据:借一行或借用多行但具有完整原始宽度是连续实例:Mat img = cv::imrea.
·
1.1.isContinuous:
如矩阵元素连续存储且每行末尾没有间隙,则该方法返回true。否则,它返回false。
1.2.连续矩阵:
说明:
1x1或1xN矩阵始终是连续
创建新矩阵(create(),imread(),clone()或构造函数Mat::Mat(...))始终是连续
矩阵借用数据:借一行或借用多行但具有完整原始宽度是连续
实例:
Mat img = cv::imread(img_name)
cv::Mat mat(nRows, nCols, CV_32FC1);
cv::Mat dst(src.size(), src.type());
1.3.不一定连续矩阵:
1)通过从现有矩阵借用数据来创建新矩阵会导致数据不连续
2)用Mat :: col(),diag()提取矩阵一部分,或为外部分配数据构造矩阵头可能不连续
dst.reshape(0);//不连续
1.4.应用:
图像用像素指针转矩阵必须对内存进行重新排序,因此请检查连续性
if ( ! mat.isContinuous() ){ mat = mat.clone();}
注意:图像尺寸尽量保持为偶数
2.实例:
#include <opencv2\opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
Mat img = imread("C:/Users/Administrator/Desktop/ProjectSwigWin/pictures/girl.jpg");
cout << "continuous= " << img.isContinuous() << endl; //连续
// 构造外部分配数据的矩阵头
Mat mat1 = img.col(0);
cout << "continuous= " << mat1.isContinuous() << endl;//0
// Matrix (self) 表达式
mat1 = mat1 + 2;
cout << "mat1 is continuous? " << mat1.isContinuous() << endl;//0
// Matrix 表达式创建新矩阵
Mat expr = mat1 + 2;
cout << "expr is continuous? " << expr.isContinuous() << endl;//1
// Clone创建新矩阵
Mat mat2 = img.col(0).clone();
cout << "continuous? " << mat2.isContinuous() << endl;//1
// 创建新矩阵Create
Mat mat(10, 10, CV_32FC1);
cout << "mat is continuous? " << mat.isContinuous() << endl;//1
std::vector<cv::Mat> mats(7);
// continuous as created using constructor
mats[0] = cv::Mat::ones(1000, 800, CV_32FC3);
// NOT continuous as borrowed data is not continuous (multiple rows and not full original width)
mats[1] = mats[0](cv::Rect(100, 100, 300, 200));
// continuous as created using clone()
mats[2] = mats[1].clone();
// 借用单行是连续
mats[3] = mats[2].row(10);
// 借用多行是不连续
mats[4] = mats[2](cv::Rect(5, 5, 100, 2));
// 连续的借用数据是连续的(多行,完全原始宽度)
mats[5] = mats[2](cv::Rect(0, 5, mats[2].cols, 2));
// NOT continuous as borrowed data is not continuous (multiple rows and not full original width)
mats[6] = mats[2].col(10);
cout << "mats[0]=" << mats[0].isContinuous() << endl;//1
cout << "mats[1]=" << mats[1].isContinuous() << endl;//0
cout << "mats[2]=" << mats[2].isContinuous() << endl;//1
cout << "mats[3]=" << mats[3].isContinuous() << endl;//1
cout << "mats[4]=" << mats[4].isContinuous() << endl;//0
cout << "mats[5]=" << mats[5].isContinuous() << endl;//1
cout << "mats[6]=" << mats[6].isContinuous() << endl;//0
return 0;
}
更多推荐
所有评论(0)