本章节中,将会学习到:
Mat image;
image = imread( imageName, IMREAD_COLOR ); // Read the file
功能介绍:
从指定路径中读取所选择的图像
参数解释:
String imageName( "../data/HappyFish.jpg" );
namedWindow( "Display window", WINDOW_AUTOSIZE );
imshow( "Display window", image );
功能介绍:
在窗口中显示Mat对象(即对象)。
参数解释:
需要了解Mat的第一件事是,不再需要手动分配其内存。在执行此操作仍然是可能的情况下,大多数OpenCV功能将自动分配其输出数据。如果传递已经存在的Mat对象(已经为矩阵分配了所需的空间),那么这是一个很好的事情,这将被重用。换句话说,我们在任何时候都使用与我们需要执行任务一样多的内存。
Mat基本上是一个具有两个数据部分的类:矩阵头(包含矩阵的大小,用于存储的方法,存储在哪个地址的信息等等)和指向包含像素值(取决于所选存储方法的任何维度)。矩阵头大小是恒定的,然而矩阵本身的大小可以随着图像的不同而变化,通常会大一个数量级。
OpenCV使用引用计数系统。这个想法是每个Mat对象都有自己的头,但是通过使它们的矩阵指针指向相同的地址,矩阵可以在它们的两个实例之间共享。此外,复制操作符只会将头和指针复制到大矩阵,而不是数据本身。
Mat A, C; // 创建两个MAT容器的对象头
A = imread(argv[1], IMREAD_COLOR); // 为A对象添加实际的矩阵数据,imread() 返回的就是一个Mat对象。
Mat B(A); // 使用拷贝构造函数创建Mat对象B
C = A; // 修改操作
所有上述对象,最后指向相同的单个数据矩阵。然而,它们的头部是不同的,并且使用它们中的任何一个进行修改也会影响所有其他的。在实践中,不同的对象只是向相同的底层数据提供不同的访问方法。然而,他们的头部不一样。
可以询问矩阵本身是否属于多个Mat对象,它们在不再需要时负责清理它。简短的答案是:使用它的最后一个对象。这是通过使用引用计数机制来处理的。每当有人复制Mat对象的标题时,矩阵的计数器就会增加。每当头部被清洁时,这个计数器就会减少。当计数器达到零时,矩阵也被释放。有时你也想复制矩阵本身,所以OpenCV提供了cv :: Mat :: clone()和cv :: Mat :: copyTo()函数。例如:
Mat F = A.clone(); //F和A将不会采用同一个引用计数系统
Mat G;
A.copyTo(G); // 现在修改F和G都不会影响A
opencv源码链接:imread()函数使用案例
#include // opencv的核心组件,后续会为大家介绍其文件组件和大概功能
#include // 图像编码组件,处理图像的功能
#include // 可视化窗口组件
#include
#include
using namespace cv; // opencv的命名空间,表明使用的工具所在的范围
using namespace std; // 标准命名空间
int main( int argc, char** argv )
{
String imageName( "../data/HappyFish.jpg" ); // 定义图片名称对象imageName,这里使用自己的图片路径即可
if( argc > 1) //命令行参数个数大于1时
{
imageName = argv[1]; // 取命令行的第二个参数作为图像路径
}
Mat image;
image = imread( imageName, IMREAD_COLOR ); // 读取文件
if( image.empty() ) // 检查图片对象是否是空数据
{
cout << "Could not open or find the image" << std::endl ;
return -1;
}
namedWindow( "Display window", WINDOW_AUTOSIZE ); // 创建图像显示窗口
imshow( "Display window", image ); // 在窗口中显示图像
waitKey(0); // 图像显示的时间,为系统结束前的阻塞时间,如果想要看到图片显示效果,建议此值设置在(3000以上,单位ms)
return 0;
}
编译代码(使用CMAKE编译即可,编译方法:Cmake编译opencv项目的编译方法,然后运行可执行文件,将图像路径作为参数。如果你在Windows上,可执行文件当然也会包含一个exe扩展名。当然确保图像文件靠近你的程序文件。编译完成后,执行程序:
./Demo demo.jpg # 这里我的项目叫Demo,图片名称demo,文件类型jpg
快来动手试试看吧!有问题可以私聊哦。