OpenCV的读取图像使用注意事项

来源:互联网 发布:大数据时代论文3000字 编辑:程序博客网 时间:2024/06/05 13:21

最近在使用OpenCV 的时候发现了一些平时没有注意的小问题,所以记录一下,以免自己下次再犯同样的错误。

一、imread读图像函数使用注意事项

在使用imread读图像的时候,大家最常用的读取的方式就是:

Mat src = imraed("src.jpg");`

其实imread函数除了一个参数是图像路径之外,还有一个就是读取图像的方式。

1.1、imread函数原型

imread函数的原型如下:C++: Mat imread(const string& filename, int flags=1 ),后面的int型参数flags的取值决定了图像被读取的方式。

(1)、当flags>0:此时图像的读取方式是按照BGR三波段的方式进行读取的。即使输入一个单波段的灰度图像,返回的Mat对象的波段数也是3。注意:这也是默认的缺省值
(2)、当flags<0:此时图像的读取方式是按照原始图像的波段数进行读取的。比如输入灰度图像读取后的Mat是单波段的,如果是RGB的图返回的3波段的BGR的Mat图像类。
(3)、当flags=0:此时图像的读取是按照灰度图像进行读取的。即使输入三波段的RGB图像,返回的Mat对象的波段数也是1,即是该RGB图灰度化之后的结果图像。
(4)、当flags缺省:此时的读取方式和flags>0的情况是一样的。

1.2、imread使用示例

string path1 = "src1.jpg";      //灰度图像string path3 = "src3.jpg";      //RGB图像//读取方式1Mat src = imread(path1);  -- 按照3波段读取Mat src = imread(path3);  -- 按照3波段读取//读取方式2Mat src = imread(path1, 3);  -- 按照3波段读取Mat src = imread(path3, 3);  -- 按照3波段读取//读取方式3Mat src = imread(path1, 0);  -- 按照1波段灰度图像读取Mat src = imread(path3, 0);  -- 按照1波段灰度图像读取//读取方式4Mat src = imread(path1, -1);  -- 按照path1图像本身形式读取,单波段Mat src = imread(path3, -1);  -- 按照path3图像本身形式读取,三波段

注意:在使用imread读取图像的时候,一定要注意图像本身的形式以及采取imread读取的方式,如果每次都是将flags缺省,比如读取图像本身是灰度图,其实是按照BGR图像读的,这样会出错。

二、imshow显示图像函数使用注意事项

error:有一次在使用imshow函数显示图像的时候,遇到了一个问题,无论怎么运行,就是无法显示图像,最后才发现,在程序的末尾忘了加waitKey()函数。
记住:imshow函数必须与waitKey()函数结合才能正确显示图像,这是一个细节,因为这个waitKey()函数太普遍了,大家有时候忘记加了,但是检查不出错误….

三、Mat类使用细节

3.1、Mat类读取图像数据和参数

Mat src = imread("src.jpg");int width = src.cols;       //获取图像宽度int height = src.rows;      //获取图像高度int band = src.channels();  //获取图像波段数uchar* pImgData = src.data;     //获取图像存储图像灰度信息的内存的首地址

使用Mat类的成员变量和函数读取图像参数信息:
(1)、成员变量cols – 对应图像的列数 – 对应平常咱们所说的图像宽度
(2)、成员变量rows – 对应图像的行数 – 对应平常咱们所说的图像高度
(3)、成员变量data – 对应存储图像灰度值内存的首地址
(3)、成员函数channels() – 获取图像波段数

//后面有什么问题需要加的再继续加吧,这个博客就当一个笔记本吧,哈哈哈~

0 0