OpenCV(C++接口)学习笔记1-图像的读取、显示、保存

OpenCV在2.0版本之后添加了C++接口函数,之前学习的都是C语言的接口函数,现在OpenCV已经发展到2.4.9版本了,所以决定学习C++接口函数,跟上节奏。

1、创建图像

cv::Mat image;

采用类cv::Mat来定义图像变量或矩阵变量。

当然你也可以指定图像的大小:

cv::Mat img(240,320,CV_8U,cv::Scalar(100));

参数CV_8U中的U代表unsigned,而S代表signed.对于三通道彩色图像可以用CV_8UC3。你也可以声明16或32位的整型三通道图像(如CV_16SC3)。

我们可以通过调用size()函数可以获取图像的大小。

std::cout << "size: " << image.size().height << " , "
<< image.size().width << std::endl;

2、获取图像

image= cv::imread("img.jpg");

3、显示图像

cv::namedWindow("Original Image"); // define the window
cv::imshow("Original Image", image); // show the image

4、保存图像

cv::imwrite("output.bmp", result);

5、复制

在这里“=”运算符使得两个图像共享同一个数据,如果想要创建一个图像并复制原图像的数据到新的内存区域,则需要调用成员函数copyTo()。

cv::Mat image2, image3;
image2= result; // the two images refer to the same data
result.copyTo(image3); // a new copy is created

所以我们可以放心地用函数返回一幅图像:

cv::Mat function() {
// create image
cv::Mat ima(240,320,CV_8U,cv::Scalar(100));
// return it
return ima;
}

在main函数中我们调用function():

// get a gray-level image
cv::Mat gray= function();

则gray与ima共享的是同一数据。

6、IplImage和Mat转换

IplImage* iplImage = cvLoadImage("c:\\img.jpg");
cv::Mat image4(iplImage,false);

这种方式要注意调用cvReleaseImage(&iplImage);来释放内存。

cv::Mat image4(iplImage,false);中的第二个参数的作用是说明是否复制图像数据到新的内存区域,false则为否,true为是。如果选否,则两幅图像共用同一片内存区域。此时如果调用cvReleaseImage(&iplImage);则将会使得image4中的数据被释放。

为防止忘记释放内存,你可以采用以下方式来创建:

cv::Ptr<IplImage> iplImage = cvLoadImage("c:\\img.jpg");

但是,最好的方法还是直接采用cv::Mat来定义图像。

7、x,y轴的仿射变换

cv::flip()函数进行仿射变换,函数的第三个参数取值:正则表示水平变化,0则表示垂直变化,负则两个都变。

cv::Mat result;
cv::flip(image,result,1); 	// positive for horizontal
				// 0 for vertical,
				// negative for both

例程1:

/************************************************************************/
/* 打开并显示图像,并对图像进行关于x,y轴的仿射变换                                                                     */
/************************************************************************/

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <string>
using std::string;
using namespace cv;

int main()
{
	string str="E:\\test\\LENA.BMP";
	Mat img1= imread(str);
	if (img1.data)
	{
		namedWindow("LENA");
		imshow("LENA",img1);
		Mat res;
		flip(img1,res,-1);
		namedWindow("result");
		imshow("result",res);
		waitKey();

	}

	return 1;
}

OpenCV(C++接口)学习笔记1-图像的读取、显示、保存,布布扣,bubuko.com

时间: 2024-08-02 02:50:25

OpenCV(C++接口)学习笔记1-图像的读取、显示、保存的相关文章

OpenCV2学习笔记:图像的读取与显示

1. 图像读取:imread() Mat imread(const string& ?lename, int ?ags=1 ) 参数介绍: filename: 待加载的文件名称. flags: 此标志用来指定被加载图像的颜色类型(color type).这个标志的取值可以有: -- CV_LOAD_IMAGE_ANYDEPTH : 如果设置这个标志的话,如果图像为16位或32位深度的图像,则返回对应深度的图像:否则,将图像转换为8位深度图像再返回. -- CV_LOAD_IMAGE_COLOR

Spark学习笔记4:数据读取与保存

Spark对很多种文件格式的读取和保存方式都很简单.Spark会根据文件扩展名选择对应的处理方式. Spark支持的一些常见文件格式如下: 1.文本文件 使用文件路径作为参数调用SparkContext中的textFile()函数,就可以读取一个文本文件.也可以指定minPartitions控制分区数.传递目录作为参数,会把目录中的各部分都读取到RDD中.例如: val input = sc.textFile("E:\\share\\new\\chapter5") input.fore

R语言学习笔记(数据的读取与保存)

library(MASS)#载入package MASSdata(package="MASS") #查看MASS中的数据集data(SP500,package="MASS") #载入MASS中的SP500数据集data(SP500) #简化写法getwd() #返回当前工作目录setwd("d:/r/r-data") #将当前工作路径修改为 data=read.table("d:/r/r-data/salary.txt",he

OpenCV(C++接口)学习笔记2-像素级的图像操作

1.通过成员函数at(int y, int x)访问 这种方法需要知道像素保存的格式. (1) 这是为模板类型的函数,因为一个函数的返回类型只有在运行时才会知道. (2)这个函数返回的是一个向量即Vector,故有下标的操作. image.at<uchar>(j,i)= 255; 在单通道图像中,采用以上语句可以获取图像(i,j)处的灰度值(注:先行后列,一般用j表示行(rows),i表示列(cols)).如果是灰度图像的话,只需要更改一个数据就可以了.如果是rgb图像的话,就要用"

OpenCV(C++接口)学习笔记4-Mat::operator = 的陷阱

当我们想要将一个Mat对象的数据复制给另一个Mat对象时,应该怎么做呢? 我们发现,OpenCV提供了重载运算符Mat::operator = ,那么,是否按照下列语句就可以轻松完成对象的赋值呢? Mat a; Mat b = a; 答案是否定的! 我们可以从reference manual 中看到: Mat::operator = Provides matrix assignment operators. C++: Mat& Mat::operator=(const Mat& m) Pa

OpenCV之Python学习笔记

OpenCV之Python学习笔记 直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看 到一本国外的新书<OpenCV Computer Vision with Python>,于是就看一遍,顺便把自己掌握的东西整合一下,写成学习笔记了.更需要的朋友参考. 阅读须知: 本文不是纯粹的译文,只是比较贴近原文的笔记:         请设法购买到出版社出版的书,支持正版. 从书名就能看出来本书是介绍在Pytho

OpenCV for Python 学习笔记 三

给源图像增加边界 cv2.copyMakeBorder(src,top, bottom, left, right ,borderType,value) src:源图像 top,bottem,left,right: 分别表示四个方向上边界的长度 borderType: 边界的类型 有以下几种: BORDER_REFLICATE # 直接用边界的颜色填充, aaaaaa | abcdefg | gggg BORDER_REFLECT # 倒映,abcdefg | gfedcbamn | nmabcd

图像编程学习笔记6——图像转置

转置(transpose)是指将x,y坐标对换,图2.2的转置如图2.15所示. 图2.2 图2.15   图2.2的转置 要注意的是,转置和旋转900是有区别的,不信你可以试试:怎么旋转,图2.2也转不出图2.15来.另外,转置后图的宽高对换了.转置的变换矩阵很简单: (2.12) 镜象变换的源代码如下,因为和旋转的那段程序很类似,程序中的注释就简单一些: 由于很多代码和之前的重复,所以只给出主要功能代码(win32 控制台程序) [cpp] view plaincopy void trans

图像编程学习笔记5——图像镜像

以下文字内容copy于<<数字图像处理编程入门>>,code为自己实现,是win32控制台程序. 镜象(mirror)分水平镜象和垂直镜象两种.图2.2的水平镜象和垂直镜象分别如图2.13和图2.14所示 图2.13   图2.2的水平镜象 图2.14   图2.2的垂直镜象 镜象的变换矩阵很简单.设原图宽为w,高为h,变换后,图的宽和高不变. 水平镜象的变化矩阵为: (2.10) 垂直镜象的变化矩阵为: (2.11) 镜象变换的源代码如下,因为和平移的那段程序很类似,程序中的注释