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;
}

 

 

 

 

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐