开篇:人生苦短,我用CV
博主现在是一名大二在校学生,大一暑假接触了OpenCV,于是便被吸引了,彻底入坑了,秉着开源的精神,和大家分享知识,探讨技术,一起进步,所以我把相关笔记写成系列博客,记录自己日常所学,也便于复习。由于某些需求,博客主要使用C++来完成记录。
准备工作
电脑、键盘、visual studio、OpenCV、脑子和双手…
人生第一个OpenCV程序:图片加载与保存
第一个测试程序(图片的加载与保存)
利用HighGUI 模块
#include <opencv2/opencv.hpp> #包含OpenCV所有模块头文件
#include <iostream> #包含C++输入输出流头文件
using namespace cv; #向编译器说明调用的函数处于opencv命名空间
using namespace std; #向编译器说明调用的函数处于C++标准库命名空间
int main(int argc, char** argv) {
Mat src = imread("D:/cv/Logo",IMREAD_UNCHANGED);#imread函数作用是载入图片
if (src.empty()) {
printf("could not find image file");
return -1;
}
namedWindow("001-demo", WINDOW_AUTOSIZE); #命名窗口。尺寸系统选择
imshow("001-demo", src); #显示图片
imwrite("D:/testone.png", src); #保存图片
waitKey(0); #暂停并等待键盘事件,0表示永远地等待按键,键入的正数表示等待的毫秒数。
destroyAllWindows(); #关闭所有窗口
return 0;
}图片的水平翻转
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
Mat src = imread("D:/OpenCV/opencv/sources/opencv-logo.png", IMREAD_UNCHANGED);
namedWindow("Original Image");
imshow("Original Image", src);
Mat result;
flip(src, result, 0); #翻转函数// 正数表示水平,0 表示垂直, 负数表示水平和垂直。
namedWindow("Output Image");
imshow("Output Image", result);
waitKey(0);
return 0;
}认识Mat对象
Mat:即图像文件的内存数据对象。cv::Mat 类是用来存放图像(以及其他矩阵数据)的数据结构。在所有OpenCV 类和函数中,这个数据结构占据着核心地位 。cv::Mat 有两个必不可少的组成部分:一个头部和一个数据块。头部包含了矩阵的所有相关信息(大小、通道数量、数据类型等),数据块包含了图像中所有像素的值。头部有一个指向数据块的指针,即data 属性。cv::Mat 有一个很重要的属性,即只有在明确要求时,内存块才会被复制。实际上,大多数操作仅仅复制了cv::Mat 的头部,因此多个对象会指向同一个数据块。这种内存管理模式可以提高应用程序的运行效率,避免内存泄漏,但是我们必须了解它带来的后果。图像的尺寸信息通常也需要传递给调用函数。前面讲过,我们可以用属性cols 和rows 来获得cv::Mat 实例的大小。cv::Size 结构包含了矩阵高度和宽度,同样可以提供图像的尺寸信息。另外,可以用size()方法得到当前矩阵的大小。当需要指明矩阵的大小时,很多方法都使用这种格式。如果你需要把一幅图像复制到另一幅图像中,且两者的数据类型不一定相同,那就要使用convertTo 方法了:
// 转换成浮点型图像[0,1]
image1.convertTo(image2,CV_32F,1/255.0,0.0);
本例中的原始图像被复制进了一幅浮点型图像。这一方法包含两个可选参数:缩放比例和偏
移量。需要注意的是,这两幅图像的通道数量必须相同。
结语
努力,努力,努力!
















