预备知识:
opencv2用cv::Mat类型来声明表示图像的变量。例如:
cv::Mat image; //建立高度和宽度为0的图像,默认尺寸为0
也可以指定初始尺寸
Mat image(240,320,CV_8U,Scalar(100)); //CV_8U表示8位无符号整形
Mat容器内元素的数据类型介绍
CV_<bit_depth>(S|U|F)C<number_of_channels>
1--bit_depth---比特数---代表8bite,16bites,32bites,64bites---举个例子吧--比如说,如
如果你现在创建了一个存储--灰度图片的Mat对象,这个图像的大小为宽100,高100,那么,现在这张
灰度图片中有10000个像素点,它每一个像素点在内存空间所占的空间大小是8bite,8位--所以它对
应的就是CV_8
2--S|U|F--S--代表---signed int---有符号整形
U--代表--unsigned int--无符号整形
F--代表--float---------单精度浮点型
3--C<number_of_channels>----代表---一张图片的通道数,比如:
1--灰度图片--grayImg---是--单通道图像
2--RGB彩色图像---------是--3通道图像
3--带Alph通道的RGB图像--是--4通道图像
通过cv::Mat的size()方法可以获取图像的尺寸
#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <iostream> using namespace cv; using namespace std; int main(int argc, char** argv) { Mat image; cout << "sizeof image = " << image.size().height<<" "<< image.size().width << endl; waitKey(0); return 0; }输出结果:
sizeof image = 0 0
下面的读取函数 进行文件读取、解码和内存的分配:
image = cv::imread("1.png");判断是否读取成功的函数(在读取文件时要判断是否读取成功):
if (!image.data) //未成功读取时,image.data为0 { cout << "wrong!" << endl; return -1; } if (image.empty()) //读取成功时候,image.empty()为0 { cout << "wrong!" << endl; return -1; }定义窗口和显示图像:
namedWindow("picture1"); //定义窗口 不加这句也可以显示图像
imshow("picture1", image); //在定义的窗口内显示图像
垂直反转和水平反转:
Mat result;
flip(image, result, num); //num大于0表示水平反转,0表示垂直反转,负数表示既有水平又有垂直反转
保存图片文件:
imwrite("D:/2.png",result); //将图像数据结果保存到D:/2.png(创建了图片2.png)
CV::Mat 实现引用计数和浅拷贝:
图像之间进行赋值时,图像数据没有发生复制,两个对象指向同一块内存
引用计数的目的是当所有引用内存数据对象都析构后,才会释放内存块。
尽量避免返回Mat类成员(返回时候仅发生浅拷贝,一旦再次调用这个函数,之前返回的Mat数据可能发生变化,可以返回一个深拷贝的成员来避免这种错误)
深拷贝只能用:
result.copyto(image2); //将result拷贝到image2
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。