OpenCV学习笔记(二)——Mat,图像的新容器

基础知识

自从版本2.0,OpenCV采用了新的数据结构,用Mat类结构取代了之前用extended C写的cvMat和lplImage,更加好用啦,最大的好处就是更加方便的进行内存管理,对写更大的程序是很好的消息。

#include<opencv2\opencv.hpp>
#include <iostream>  
using namespace cv;
using namespace std;
int main(int argc,char *argv[])
{
    Mat image;      //声明类
    image = imread("lena.jpg", IMREAD_COLOR); 
    if (!image.data){               // Check for invalid input 
         cout << "Could not open or find the image" << std::endl;
         return -1;
    }
    Mat gray_image;
    cvtColor(image, gray_image, CV_BGR2GRAY);  //将彩色图像变为灰度图像
    imwrite("Gray_Image.jpg", gray_image);    //write picture
    namedWindow("Color image", CV_WINDOW_AUTOSIZE);
    namedWindow("Gray image", CV_WINDOW_AUTOSIZE);
    imshow("Color image", image);      //原图
    imshow("Gray image", gray_image);  //灰色
    waitKey(0);
    return 0;
}

Mat解析

1. Mat是一个类,有构造函数,赋值函数等

1 Mat A, C; // creates just the header parts
2 A = imread(argv[1], CV_LOAD_IMAGE_COLOR); // here we’ll know the method used (allocate matrix)

3 Mat B(A); // Use the copy constructor

4 C = A; // Assignment operator

2. 如果要拷贝自己的矩阵:

1 Mat F = A.clone();
2 Mat G;
3 A.copyTo(G);

3. 构造函数解析

 Mat M(2,2, CV_8UC3, Scalar(0,0,255));  
 cout << "M = " << endl << " " << M << endl << endl;

构造2*2的矩阵。
CV_[The number of bits per item][Signed or Unsigned][Type Prefix]C[The channel number]
CV_8UC3 means we use unsigned char types that are 8 bit long and each pixel has three of these to form the three channels.

4. 与原始的转换

IplImage* img = cvLoadImage("greatwave.png", 1);
Mat mtx(img); // convert IplImage* -> Mat
Mat I;  
IplImage* pI = &I.operator IplImage();  
CvMat* mI = &I.operator CvMat();  

5. 改变矩阵creat()函数
不能用来初始化一个矩阵,它不是构造函数,它用来改变一个已有的矩阵的格式。

Create() function:
M.create(4,4, CV_8UC(2));
cout << "M = "<< endl << " " << M << endl << endl;

6. Matlab类型初始化操作

Mat E = Mat::eye(4, 4, CV_64F);
cout << "E = " << endl << " " << E << endl << endl;
Mat O = Mat::ones(2, 2, CV_32F);
cout << "O = " << endl << " " << O << endl << endl;
Mat Z = Mat::zeros(3,3, CV_8UC1);
cout << "Z = " << endl << " " << Z << endl << endl;
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值