OpenCV(三) 图像的读取和显示

OpenCV中的C++类和函数都是定义在命名空间cv之内的,有两种方法可以访问。
第一种是,在代码开头的适当位置,加上 usingnamespace cv; 这句。

另外一种是在使用OpenCV类和函数时,都加入cv::命名空间。不过这种情况难免会不爽,每用一个OpenCV的类或者函数,都要多敲四下键盘写出cv::,很麻烦。

看了浅墨大神的文章推崇在代码开头的适当位置,加上using namespace cv;
这句。于是和opencv命名空间一了百了了

#include <opencv2/core/core.hpp>  
#include<opencv2/highgui/highgui.hpp>   
using namespace cv;

Data in memory

图片的矩阵表示

灰度图像的存储

RGB图像内存中的存储
BGR????不晓得什么鬼。。。貌似没有什么解释。

图像的读取和显示

#include<iostream> 
#include<stdlib.h>
#include <opencv2/core/core.hpp>  
#include <opencv2/highgui/highgui.hpp>  
using namespace cv;
int main()
{
    // 读入一张图片  
    Mat img = imread("F:\\IMG.jpg");
    // 创建一个名为 "百度LOGO"窗口  
    namedWindow("百度LOGO");
    // 在窗口中显示百度LOGO
    imshow("百度LOGO", img);
    // 等待500ms后窗口自动关闭  
    waitKey(500);
    //因为貌似从某个版本的vs之后,黑框都会一闪就没了,为了看程序效果所以加了waitKey()  PS:本来stdlib.h头文件里面的system("pause")也可以不知为啥今天不显示了
    return 0;
}

程序效果图

关于Mat类

Mat类构造函数(1)

/*cv::Mat类是用于保存图像以及其他矩阵数据的数据结构。默认情况下,
其尺寸为0,我们也可以指定初始尺寸,比如,比如定义一个Mat类对象,就
要写
*/
cv::Mat::Mat(int ndims,const int *  sizes,int type,const Scalar& s) 
/*该构造函数与使用了Scalar参数,作用是能够通过Scalar数据类来初始
化元素值,例如,我们要生成一张白色背景的图片:*/
Mat src1(300, 400, CV_8UC3,Scalar(255,255,255));
imshow("test", src1);

上面代码效果图
Mat常用构造函数(2)

cv::Mat::Mat(int rows,int cols,int type)
/*重载的构造函数,这也是常用构造函数之一,在创建对象同时,提供矩阵
的大小(行数 ,列数)以及存储类型(type),该类型表示矩阵中每一个元
素在计算机内存的存储类型,如CV_8UC3,具体含义为“3通道8位无符号数”。*/
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main(int argc, char* argv[])
{
    Mat src(220,220,CV_8UC3);
    namedWindow("CV_8UC3");
    imshow("CV_8UC3",src);
    waitKey(5000);
    return 0;
}

CV_8UC3示意图
OpenCV还提供了一种Size() 数据结构来构造Mat对象(3)

cv::Mat::Mat(Size size,int type );
//示例代码
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main(int argc, char* argv[])
{
    Mat src1(3, 4, CV_32FC3);
    Mat src2(Size(3, 4), CV_32FC3);
    cout << "src1.rows=" << src1.rows << " src1.cols=" << src1.cols <<endl;
    cout << "src2.rows=" << src2.rows << " src2.cols=" << src2.cols << endl;
    cout << "src1.size="<<src1.size() << endl <<"src2.size=" << src2.size() <<endl;
    return 0;
}

输出结果:

src1.rows=3 src1.cols=4
src2.rows=4 src2.cols=3
src1.size=[4 x 3]
src2.size=[3 x 4]

PS:大致只是知道这是用来操作分辨率之类的。不过位置来回变不是很懂这操作是什么鬼,懂了之后再回来修改吧。
常用构造函数(4)

    cv::Mat::Mat(const Mat & m)
    //核心代码示例
    double m[50][50] = {0};
    //使用一维或多维数组来初始化矩阵
    Mat M=cv::Mat(50,50,CV_64F,m);
    namedWindow("Hello");
    imshow("Hello", M);
    waitKey(50000);
    return 0;

运行结果:
这里写图片描述

Mat中拷贝问题

分为shallow copy和deep copy两种类型
shallow copy 中 m1和m2 ,m2发生变化,m1也会发生相同的变化
deep copy 中,m1和m2。

Mat中的一些特殊类型

Mat Z=Mat::zeros(2,3,CV_8UC1); //2X3的全0矩阵
cout<<Z<<endl;

输出结果:

[ 0, 0, 0;
0, 0, 0]

 Mat Z=Mat::ones(2,3,CV_32F);
  //32F和64F是double 和float的区别
 cout<<Z<<endl;

输出结果:

[1, 1, 1;
1, 1, 1]

 Mat Z=Mat::eye(2,3,CV_32F);
 //
 cout<<Z<<endl;

输出结果:

[1, 0, 0;
0, 1, 0]

猜你喜欢

转载自blog.csdn.net/wo164683812/article/details/79995709