精华内容
下载资源
问答
  • 在c++中使用Mat构造一个核函数其实很简单,下面给出代码示例 //需要包含的头文件 #include<iostream> #include<opencv2/opencv.hpp> //定义命名空间 using namespace std; using nam

    在c++OpenCV 4中Mat的矩阵运算,极大的简化了计算量,使得代码更容易实现。
    有许多函数的实现需要使用滤波器(核函数、掩膜运算)等等,很多种叫法,但实际上就是构造一个3x3或者5x5以及更大的矩阵,完成一个卷积运算。
    在c++中使用Mat构造一个核函数其实很简单,下面给出代码示例

    //需要包含的头文件
    #include<iostream>
    #include<opencv2/opencv.hpp>
    
    //定义命名空间
    using namespace std;
    using namespace cv;
    
    int main(){
    	Mat dist_1, dist_2, dist_3, dist_4;
    	Mat kenal=(Mat_<uchar>(5,5)<<1,1,1,1,1,
    		1,1,1,1,1,
    		1,1,0,1,1,
    		1,1,1,1,1,
    		1,1,1,1,1);
    }
    	//计算图像中不同像素之间的欧氏距离
    	distanceTransform(kenal, dist_1, 2, 5, CV_8U);
    	cout << "欧氏距离:" << endl << dist_1 << endl;
    	//计算图像中不同像素之间的街区距离
    	distanceTransform(kenal, dist_2, 1, 3, CV_8U);
    	cout << "街区距离:" << endl << dist_2 << endl;
    	//计算图像中不同像素之间的棋盘距离
    	distanceTransform(kenal, dist_3, 3, 5, CV_8U);
    	cout << "棋盘距离:" << endl << dist_3 << endl;
    

    上面程序的测试结果如下图所示:
    在这里插入图片描述
    这里用的是OpenCV自带的距离计算函数distanceTransform。函数原型如下:

    void distanceTransform(InputArray src,
    					   OutputArray dts,
    					   int distanceType,
    					   int maskSize,
    					   int dstType=CV_32F
    					   )
    

    src:表示输入图像,数据类型为CV_8U的单通道图像
    dst:输出图像,尺寸与输入相同,数据类型为CV_8U或者CV_32F
    distanceType:选择计算像素之间的距离方法的标志
    maskSize:距离变换掩码矩阵的尺寸
    distType:输出图像的数据类型,可以是CV_8U或者CV_32F。

    展开全文
  • Mat 构造方法实例

    2017-06-21 15:36:53
    Mat M(2,2,CV_8UC3,Scalar(0,0,255)); cout &lt;&lt; "M= "&lt;&lt; endl &lt;&lt; " "&lt;&lt; M &lt;&lt; endl; M : [0,0,255 0,0,255  0,0,255,...
    • Mat M(2,2,CV_8UC3,Scalar(0,0,255));
      cout << "M= "<< endl << "  "<< M << endl;

    M :   [0,0,255 0,0,255

     0,0,255,  0,0,255 ]

    sizeof(M) = 56####

    CV_8UC3:

    CV_[位数][是否为带符号类型U为Unsigned char][类型前缀]C[通道数]

    Scalar 是short向量

    使用定制化值来初始化矩阵

    还可以用来表示颜色

    • 多维矩阵

    int sz[]={3,3,3};

    Mat L(3,sz,CV_8UC,Scalar::all(0));

    ——这里编译不能通过??

    • IpIImage 指针创建信息头

    Ip1Image* img = cvLoadImage("1.jpg",1);

    Mat mtx(img);

    • 利用Create() 函数

    Mat M;
    M.create(4,4,CV_8UC(2));
    cout << M << endl;

    —— 输出4行,205 205 205 205 205 205 205 205

    ——为什么是 205?

    • Matlab式初始化方式

    Mat M= Mat::eye(4,4,CV_64F);
    cout << M << endl; //单位矩阵
    cout << sizeof(M);     //还是56 果然是信息头,不包含矩阵

     

     

    Mat M= Mat::ones(4,4,CV_64F);
    cout << M << endl;// 全为1 矩阵
    cout << sizeof(M);      //56

     

    Mat M= Mat::zeros(4,4,CV_64F);
    cout << M << endl;
    cout << sizeof(M);  //56  全为0

     

    • 使用逗号,对小矩阵分隔式  分别 赋值

    Mat M= (Mat_<double>(3,3)<< 0,-1,2,3,4,5,67,8,0);
    cout << M << endl;
    cout << sizeof(M);

    • 通过已经存在的对象创建信息头

    Mat M= (Mat_<double>(3,3)<< 0,-1,2,3,4,5,67,8,0);
    cout << M << endl;
    cout << sizeof(M);


    cout << """""""""""""""" << endl;
    Mat Rowclone = M.row(1).clone();
    cout << Rowclone << endl;

     

    随机方法填充Mat矩阵

    #include "opencv2/opencv.hpp"
    #include <iostream>
    
    using namespace std;
    using namespace cv;
    
    int main()
    {
    	
    	Mat uR(3,3,CV_8UC3);
    	cout << uR << endl;
    	//均匀分布填充
    	randu(uR, Scalar::all(0), Scalar::all(255));
    	cout << uR << endl;
    	
    
    	Mat nR(3, 3, CV_8UC3);
    	cout << nR << endl;
    	randn(nR, Scalar::all(100), Scalar::all(25)); //第一个数字为均值,第二个为标准差
    	cout << nR << endl;
    	
    	Mat nR2(3, 3, CV_8UC3);
    	cout << nR2 << endl;
    	randn(nR2, Scalar(20,100,150), Scalar(50,25,5)); //第一个数字为均值,第二个为标准差,2个分别对应
    	cout << nR2 << endl;
    	waitKey(0);
    		return 0;
    	}
    
    	
    
    

     

    展开全文
  • Mat,不再需要手动分配其内存并在不需要时立即释放它。大多数OpenCV函数都会自动分配其输出数据。 Mat基本上是一个包含两个数据部分的类:矩阵头(包含诸如矩阵大小,用于存储的方法,存储矩阵的地址等信息)和指向...

    Mat不再需要手动分配其内存并在不需要时立即释放它。大多数OpenCV函数都会自动分配其输出数据。

    Mat基本上是一个包含两个数据部分的类:矩阵头(包含诸如矩阵大小,用于存储的方法,存储矩阵的地址等信息)和指向包含矩阵的矩阵的指针。像素值(取决于选择存储的方法取任何维度)。矩阵标题大小是恒定的,但是矩阵本身的大小可能因图像而异,并且通常大于数量级。

    #include <opencv2/opencv.hpp>

    #include <iostream>

    using namespace cv;

    using namespace std;

    int main(int artc, char** argv) {

             Mat src = imread("D:/test.png");

             if (src.empty()) {

                      printf("could not load image...\n");

                      return -1;

             }

             namedWindow("input", CV_WINDOW_AUTOSIZE);

             imshow("input", src);

        // 创建方法 - 克隆

             Mat m1 = src.clone();//重新分配 一块内存存储

             // 复制

             Mat m2;

             src.copyTo(m2);//重新分配一块内存存储

             // 赋值法

             Mat m3 = src;//仅复制指向该图像内存的指针,并没有重新分配内存

             // 创建空白图像

             Mat m4 = Mat::zeros(src.size(), src.type());

             Mat m5 = Mat::zeros(Size(512, 512), CV_8UC3);

             Mat m6 = Mat::ones(Size(512, 512), CV_8UC3);

             Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0,

                      -1, 5, -1,

                      0, -1, 0);

             waitKey(0);

             return 0;

    }

     

    转载于:https://www.cnblogs.com/chenhuanting/p/10830103.html

    展开全文
  • 1.构造函数 ※ cv::Mat(int rows,int cols,int type,int const Scalar&s );指定类型的二维数组,并指定初始化值 例: cv::Mat m(3, 10, CV_32FC3, cv::Scalar(1.0f, 0.0f, 1.0f)); 上述代码表示: ...

    1.构造函数
    ※ cv::Mat(int rows,int cols,int type,int const Scalar&s );指定类型的二维数组,并指定初始化值
    例:

    cv::Mat m(3, 10, CV_32FC3, cv::Scalar(1.0f, 0.0f, 1.0f));
    

    上述代码表示:构建一个3行7列的图像矩阵,CV_32F是指每个元素的值的类型为32位浮点型,C3表示通道数为3,cv::Scalar(1.0f, 0.0f, 1.0f)表示每个通道的值都为(1,0,1)。

    其中Scalar是一个由长度为4的数组作为元素构成的结构体,Scalar最多可以存储四个值,没有提供的值默认是0。定义如下:

    typedef struct Scalar{    
    	double val[4];
    }Scalar;
    

    2.获取数组元素
    访问一个元素的两种主要方式是通过位置直接或迭代器访问。
    ※通过位置直接访问

    	cv::Mat m(3, 10, CV_32FC3, cv::Scalar(1.0f, 0.0f, 1.0f));
    	cout << m.at<cv::Vec2f>(0, 0)[0] << endl;
    	cout << m.at<cv::Vec2f>(0, 0)[1] << endl;
    	cout << m.at<cv::Vec3f>(0, 0)[2] << endl;
    

    遇到的问题:
    三通道彩色图像指针访问时
    不可以这样直接输出

    cout <<  src_m.at<Vec3b>(i, j)[0];
    

    要这样:

    	int b, g, r;
    	b = src_m.at<Vec3b>(i, j)[0];
    	g = src_m.at<Vec3b>(i, j)[1];
    	r = src_m.at<Vec3b>(i, j)[2];
    	cout << "("<< b << ","<< g <<","<< r <<")  ";
    

    ※通过迭代器访问

    一种迭代器MatConstIterator_

    	int sz[3] = { 4,4,4 };
    	cv::Mat m(3, sz, CV_32FC3);//三维数组,尺寸为sz(4,4,4),类型为CV_32FC3
    	cv::randu(m, -1.0f, 1.0f); //向m中填充-1到1的随机数
    
    	float max = 0.0f;
    	//创建只读迭代器,将数组m起始点赋值给it
    	cv::MatConstIterator_<cv::Vec3f> it = m.begin<cv::Vec3f>();
    	float len2;
    	int i = 0; 
    	//遍历并比较选出最大值并输出
    	while (it != m.end<cv::Vec3f>()) {
    		len2 = (*it)[0] * (*it)[0] + (*it)[1] * (*it)[1] + (*it)[2] * (*it)[2];
    		cout << len2 << endl;
    		if (len2 > max)max = len2;
    		it++;
    	}
    	cout << "max=" << max << endl << "i=" << i << endl;*/
    

    另一种迭代器N_ary(详细定义可参考此处https://blog.csdn.net/gauss_acm/article/details/51195572

    //创建另个mat并赋随机值(0~1)
    	const int n_mat_size = 5;
    	const int n_mat_sz[] = { n_mat_size ,n_mat_size ,n_mat_size };
    	cv::Mat n_mat0(3, n_mat_sz, CV_32FC1);
    	cv::Mat n_mat1(3, n_mat_sz, CV_32FC1);
    	cv::RNG rng;
    	rng.fill(n_mat0, cv::RNG::UNIFORM, 0.f, 1.f);
    	rng.fill(n_mat1, cv::RNG::UNIFORM, 0.f, 1.f);
    //初始化迭代器对象
    	const cv::Mat* arrays[] = { &n_mat0, &n_mat1, 0 };
    	cv::Mat my_planes[3];
    	cv::NAryMatIterator it(arrays, my_planes);
    //按面将每个面的所有值相加
    	float s = 0.f;
    	int n = 0;
    	for (int p = 0; p < it.nplanes; p++, ++it) {
    		s += cv::sum(it.planes[0])[0];
    		s += cv::sum(it.planes[1])[0];
    		n++;
    	}
    

    3.参考文献
    OpenCV学习笔记(3)——Scalar数据类型理解
    《学习OpenCV3(中文版)》[美] 安德里安·凯勒、加里·布拉德斯基 著 , 阿丘科技、刘昌祥、吴雨培、王成龙、崔玉芳 等译,清华大学出版社

    展开全文
  • OpenCV深入学习(2)-Mat构造初始化等

    万次阅读 2012-03-20 17:14:01
    1、使用create(nrow,ncols,type)函数,或者相似的构造函数Mat(nrow,ncols,type[,fillValue]),将分配新的指定大小和格式的数组, type的意义和cvCreateMat函数一样,例如CV_8UC1意思是创建8位单通道的数组,而CV_32...
  • #include #include using namespace std; using namespace cv; int main(int argc, char**argv) { Mat src = imread("D:/vs2013新建项目/learn.png"); if (src.empty()) { cout ;
  • Mat构造函数

    2020-09-27 11:43:52
    然后我们看看Mat常用的构造函数: 1、Mat::Mat() 无参数构造方法; 2、Mat::Mat(int rows, int cols, int type) 创建行数为 rows,列数为 col,类型为 type 的图像; 3、Mat::Mat(Size size, int type) 创建大小为 ...
  • Mat-构造方法

    2020-07-17 15:06:14
    Mat构造方法 ◆ Mat() [1/29] cv::Mat::Mat ( ) These are various constructors that form a matrix. As noted in the AutomaticAllocation, often the default constructor is enough, and the proper matrix ...
  • OpenCv矩阵(Mat)的构造

    2016-12-02 19:28:34
    OpenCvMat的构造非常方便的构造法查看,帮助你快速掌握Mat构造法:#include using namespace cv; void o(Mat mat) { std::cout << mat ; } void test() { Mat I, E; // (1) Mat::Mat() o(I);
  • Mat常见构造函数

    2019-04-14 16:19:37
    无参构造方法: Mat::Mat() 创建行数为rows,列为col,类型为type的图像(图像元素类型,如CV_8UC3等) Mat::Mat(int rows, int cols, int type) 创建大小为size,类型为type的图像 Mat::Mat(Size size, int type...
  • Mat常用构造函数及IplImage 与Mat 之间的相互转换 Mat对象构造函数与常用方法 常用的构造函数有: Mat::Mat() 无参数构造方法; Mat::Mat(int rows, int cols, int type) 创建行数为 rows,列数为 col,类型为...
  • Mat构造
  • 无参构造方法: Mat::Mat() 创建行数为rows,列为col,类型为type的图像(图像元素类型,如CV_8UC3等) Mat::Mat(int rows, int cols, int type) 创建大小为size,类型为type的图像 Mat::Mat(Size size,...
  • Mat对象的构造

    2019-06-11 09:27:15
    1.部分复制:一般情况下,只会复制Mat对象的头和指针部分,不会复制数据部分。(相当于C++中的指针) Mat A=imread(imgFilePath);Mat B(A); 2.完全复制:复制头部和数据部分(相当于C++中的拷贝一份备份)Mat F=A....
  • 目录Mat类的构造1.利用默认构造函数2.根据输入矩阵尺寸和类型构造3.利用已有矩阵构造Mat类的赋值1.构造时赋值2.枚举赋值法3.循环赋值4.类方法赋值5.利用数组进行赋值 Mat类的构造 1.利用默认构造函数 默认构造函数...
  • 构造函数 Mat() Mat(int rows,int cols,int type) Mat(Size size,int type) Mat(int rows,int cols,int type,const Scalar &s) Mat(Size size,int type,const Scalar &s) Mat(int ndims,const int *...
  • Mat-构造函数与析构函数

    千次阅读 2017-08-02 23:04:00
    Mat总共有24个构造函数,包括一个默认构造函数以及23个重载了的构造函数函数列表如下: //! default constructor Mat(); //! constructs 2D matrix of the specified size and type // (_type is CV_8UC1, CV_64...
  • Mat的几种构造

    2018-10-05 23:41:13
    调用Mat构造函数或者create函数,如:&nbsp; // make a 7x7 complex matrix filled with 1+3j.Mat M(7,7,CV_32FC2,Scalar(1,3));// and now turn M to a 100x60 15-channel 8-bit matrix./...
  • Mat类常用的构造方法

    2018-09-06 19:13:14
    Mat::Mat() 无参数构造方法 Mat::Mat(int rows, int cols, int type) 创建行数为rows,类型为type的图像。 Mat::Mat(Size size, int type) 创建大小为size,类型为type的图像。 Mat::Mat(int rows, int cols, int...
  • OpenCV Mat数据类型构造

    2018-09-26 21:54:54
    Mat 的大致的数据结构可以理解为 ROW * COL 规模的矩阵,矩阵中的每个元素,是规格统一但不确定的数据元,统称为Scalar,而Scalar的格式大致为[a(,b,c,d)]这样的向量或者标量,向量的长度有时可以被理解为通道数,...
  • Mat类常用的构造函数

    千次阅读 2018-04-19 11:27:38
    无参构造方法: Mat::Mat() 创建行数为rows,列为col,类型为type的图像(图像元素类型,如CV_8UC3等) Mat::Mat(int rows, int cols, int type) 创建大小为size,类型为type的图像 Mat::Mat(Size size, int type)...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 834
精华内容 333
关键字:

mat构造