OpenCV成长之路(1):图像的读写与显示

转自:http://blog.csdn.net/cv_ronny/article/details/17396407

图像的读写与显示


一、工具篇


工欲善其事,必先利其器。学习OpenCV,肯定少不于基本的编程工具与OpenCV库。在Windows平台下你可以选择Visual Studio、CodeBlock等,当然你也可以选择在Linux平台,用VI、codeBlock都是可以的。编程平台的选择看个人爱好以及项目的开发环境。然后是OpenCV库,你可以在这里下载到最新的版本: http://opencv.org/,最近的版本已经到了2.4.7,但是OpenCV2.0以上版本差别都不算太大。关于怎么安装OpenCV,本文就不再详说了,此类教程实在太多,百度一下类似:VS2012+openCV2.4.6应该能找到你想要的结果。

二、第一个OpenCV程序


相比于“第一个C语言程序”或者“第一个Java程序”都以Hello,World!这种俗套的例程,我们的第一个OpenCV来显示一幅自己喜欢的图像。
  1. #include<opencv2/core/core.hpp>  
  2. #include<opencv2/highgui/highgui.hpp>  
  3.   
  4. int main()  
  5. {  
  6.     cv::Mat image;  
  7.     image=cv::imread("../cat.png");  
  8.     cv::namedWindow("cat");  
  9.     cv::imshow("cat",image);  
  10.     cv::waitKey(5000);  
  11.     return 0;  
  12. }  
关于上面的程序有以下几点要说明:
1,core.hpp于OpenCV的一些基础数据结构相关,highgui.hpp和openCV的一些界面相关,如显示图像的窗口。
2,Mat是OpenCV里最基本的一个类,它用来表示图像。
3,imshow是用来显示图像的函数,它的C++接口是:
  1. void imshow(const string& winname, InputArray mat)。  
第一参数是窗口名,第二个参数是要显示的图像。
4,与OpenCV相关于类或者函数都在CV命名空间里。
5,想让上面程序正确显示出你的图像,请把图像放在正确的路径,或者直接写绝对路径。
上面程序中已经用到了图像的读入函数imread、图像的显示函数imshow,那么图像的写入函数imwrite就不会显示陌生了。
  1. imwrite("output.jpg",image);  
它的第一个参数是写图像的路径,第二个参数是要写入的图像。

三、创建一个图像


在我们的第一个OpenCV程序中,用Mat来声明了一个图像,声明后图像的大上为0*0的,当然我们也可以初始化一个固定大小的图像。
  1. cv::Mat image(240,320,CV_8U,cv::Scalar(100));  
上面的代码创建了一个灰度图像,大小是320*240,图像上每个点的数据类型是无符号8位的,并用100填充所有像素点。
你可以把CV_8U换成CV_8U3来创建一个三通道的彩色图像。或者用CV_16U创建无符号16位的。

四、赋值与复制


如果我们想得到一个图像的副本并进行了下面的操作。
  1. Mat newImage=Image;  
如果我们对newImage进行修改或操作,则会直接影响Image图像,因为newImage与Image共用了数据内容。
想要真正得到一个副本可以这样做:
  1. Mat newImage;  
  2. Image.copyTo(newImage);//方法一  
  3. Mat newImage=image.clone();//方法二  
很多时候,我们并不想得到原图像的复制,但是要创建一个跟原图像大小相同的图像。下面的代码可以完成这样的功能。
  1. Mat newImage;  
  2. newImage.create(Image.size(),Image.type());  
以下是自己做实验的程序:

</pre><pre name="code" class="html">// learn_opencv1.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"


int _tmain(int argc, _TCHAR* argv[])
{
	cv::Mat image(240, 320, CV_8U);
	cv::Mat image2(240,320,CV_8U/*,cv::Scalar(100)*/);
	image = cv::imread("1.png");
	//image2 = image;
	//image.copyTo(image2);
	//image2 = image.clone();
	image2.create(image.size(), image.type());
	for (int i = 0; i < 100; i++)
		for (int j = 0; j < 100; j++)
			image2.at<unsigned char>(i, j) = 0;
	cv::namedWindow("abc");
	cv::imshow("abc",image2);
	//imwrite("hog.png",image);
	cv::waitKey(0);
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值