开篇:人生苦短,我用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);
本例中的原始图像被复制进了一幅浮点型图像。这一方法包含两个可选参数:缩放比例和偏
移量。需要注意的是,这两幅图像的通道数量必须相同。

结语

努力,努力,努力!