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