当前位置: 首页 > 工具软件 > matImage > 使用案例 >

opencv图像读取和cv::Mat

宰鸿博
2023-12-01

1、在opencv的C++ API中,所有的类和函数都在命名空间cv内定义,可以使用

using namespace cv;

或者是加上前缀 cv::

2、imread读入图像
生成的图像由无符号(unsigned char)构成(OpenCV中为CV_8U)

image=cv::imread("puppy.bmp",CV_LOAD_IAMGE_COLOR);  //读取一个图像文件,并转换为三通道彩色图像,每个像素有3个字节(CV_8U3C)

使用image.channels()可以获得图像的通道数;
当用imread打开路径制定不完整的图像时,imread会自动打开默认目录。如果从控制台运行程序,默认目录就是可执行文件所在的目录,如果从IDE中运行程序,为项目文件所在的目录。

3、imshow显示图像
imshow显示的图像是由整数(CV_16U表示16为无符号整数,CV_32S表示32为有符号整数)构成,图像每个像素的值会被除以256,以便能够在256级灰度中显示。在显示由浮点数构成的图像时,值的范围会被假设为0.0(黑色)到1.0(白色)之间,大于1.0显示白色,小于0.0显示黑色。

4、cv::Mat
(1)cv::Mat 由一个头部和一个数据块组成,头部包含了矩阵的相关信息(大小,通道数,数据类型等),数据块包含了图像中所有像素的值。头部有一个指向数据块的指针,即data属性。

cv::Mat(240,320,CV_8U,100);  //创建一个240x320的图像,每个像素对应一个字节

(2)cv::Scalar,用于在调用函数时传递像素值。

cv::Mat image(240,320,CV_8UC3,cv::Scalar(100));  //创建一个红色图像,通道顺序为BGR

(3)cv::Size,包含了矩阵的高度和宽度

cv::Mat image(cv::Size(320,240),CV_8UC3);//创建一个未初始化的彩色图像。

可以使用create方法分配或重新分配图像的数据块,如果图像已经分配,其原来的内容会被释放。

iamge.create(200,200,CV_8U);

(4)cv::Mat 的at(x,y)可以访问元素,在编译时必须明确方法返回值的的类型。
如:

image.at<uchar>(j,i)=255;

彩色图像的每个像素对应三个部分:红色,绿色,蓝色。包含彩色图像的cv::Mat返回一个向量,向量中包含三个8为的数值,访问彩色图像的方法:

image.at<cv::Vec3b>(j,i)[channel]=value;

(5)cv::Mat 的ptr方法可以直接访问图像中一个行的地址。
如:

 uchar* data=image.ptr<uchar>(j);

(6)cv::Mat的isContinuous方法可以判断出图像有没有被填充,如果图像没有被填充,它就返回true.
如:

if(image.isContinuous())
{
   //没有填充像素
   image.reshape(1,1);//设置新的通道数为1,新的行数为1
}
 类似资料: