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
}