opencv2—(1)载入、显示及保存图像

一、操作方法

声明一个表示图像的变量,在opencv2中为cv::Mat类型
cv::Mat image;

创建宽高都为0的图像,通过调用 cv::Mat 的 sizeof () 方法可以获取图像的尺寸,该方法的返回值是一个结构体,包含着宽度和高度:
std::cout<<"size,"<<image.size().height<<","
               <<image.size().width<<std::endl;

文件读取、解码以及内存分配
image=cv::imread("img.jpg");

如果文件无法被正确读取,检验方法如下:
if ( ! image. data ) {
     //图像尚未创建。。。
}
此处的data事实上是指向已分配的内存块的指针,包括图像数据

要显示这幅图像,opencv 的 highgui 模块实现该功能。首先定义一个图像显示的窗口,接着指定需要显示的图像:
cv::namedWindow( "Original Image" ) ; //定义窗口
cv::imshow( "Original Image" , image ) ; //显示图像

对图像进行处理,opencv提供很多处理函数,首先是图像水平反转的函数,flip函数便是其中一种,我们创建另一个矩阵来保存输出结果:
cv :: Mat  result ;
cv :: flip ( image, result, 1) ; //正数表示水平反转;0表示垂直反转;负数表示既有水平也有垂直反转

结果显示在另一个窗口中:
cv :: namedWindow( "Output Image" ) ;
cv :: imshow( "Output Image", result) ;

由于这是控制台程序,在 main 函数结尾处终止,添加额外的highgui函数使程序退出前等待按键的输入:
cv :: waitKey( 0 ) ;

最后要保存处理好的图片到磁盘上,同样使用 highgui 函数实现 :
cv :: imwrite( "output.bmp", result ) ;

二、分析解释
opencv的C++类和函数都定义在命名空间cv之内,想访问它们,在 main 函数前加入下述语句:
using namespace cv ;
或者使用cv::的命名空间

对于cv::Mat 默认尺寸为0 ,但你也可以指定初始尺寸:
cv::Mat ima(240, 320, CV_8U, cv::Scalar(100) );
矩阵元素的类型有CV_8U指定,表示单字节的像素图像。字母U代表无符号(Unsigned),S表示带符号(Signed)类型。对于彩色图像,你需要指定3个通道(CV_8UC3 )你也可以声明为16位或32位的(无符号的或带符号的)整数图像,如 CV_16SC3 。你也可以声明32为或64位的浮点数CV_32F 。
cv::Mat对象离开作用域后,分配的内存将自动释放。cv::Mat实现了引用计数和浅拷贝,当然你可以用copyTo( )方法进行拷贝。
cv::Mat image2, image3;
image2=result; //两个图拥有同一份数据
result. copyTo( image3 ) ; //创建新的拷贝

三、扩展
opencv2引入了C++接口,之前版本使用C函数和数据结构,其中图像是通过IplImage 操作,该结构继承自IPL库(Intel Image Processing Library 英特尔图像处理库),老式的IplImage可以转换到cv::Mat 对象。
IplImage* iplImage = cvLoadImage ( "c:\\img.jpg" ) ; //c风格的图像读取函数
cv::Mat image4 ( iplImage, false ) ; //false表示不需要进行新的拷贝,为默认值;如果是true则表示进行新的拷贝

为了避免野指针的出现,opencv2提供了一个实现引用计数的指针类,来封装IplImage :
cv::Ptr<IplImage> iplImage = cvLoadImage( "c:\\img.jpg" ) ;
否则,当你释放IplImage 结构指向的内存时,必须明确的调出:
cvReleaseImage( &iplImage ) ; 

尽量使用cv::Mat.

测试代码和结果如下:

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

// function that creates and returns an image
cv::Mat function() {

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

int main() {

	// create image
	cv::Mat image;
	// print image size
	std::cout << "size: " << image.size().height << " , "
		<< image.size().width << std::endl;
	// open image
	image = cv::imread("1.jpg");
	// check if image has been successfully read
	if (!image.data) {
		// no image has been created?
		return 0;
	}
	// print image size
	std::cout << "size (after reading): " << image.size().height << " , "
		<< image.size().width << std::endl;

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

										 // create another image
	cv::Mat result;
	// flip the image
	cv::flip(image, result, 1); // positive for horizontal
								// 0 for vertical, 						  
								// negative for both
								// display result
	cv::namedWindow("Output Image");
	cv::imshow("Output Image", result);
	// wait for key pressed
	cv::waitKey(0);
	// write image on file
	cv::imwrite("output.bmp", result);

	// create two new images
	cv::Mat image2, image3;

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

						   // flip vertically this time
	cv::flip(result, result, 0);

	// display result
	cv::namedWindow("image 2");
	cv::imshow("image 2", image2);
	cv::namedWindow("image 3");
	cv::imshow("image 3", image3);

	// get a gray-level image
	cv::Mat gray = function();
	// display result
	cv::namedWindow("Gray Image");
	cv::imshow("Gray Image", gray);

	// wait for key pressed
	cv::waitKey(0);
	return 1;
}



参考文献

OpenCV 2 Computer Vision Application Programming Cookbook .   

猜你喜欢

转载自blog.csdn.net/sinat_27614619/article/details/53964835