OpenCV2.0 C++接口函数一

转载自:http://blog.csdn.net/szlcw1/article/details/37662935

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

1、创建图像

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

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

?
1
cv::Mat img(240,320,CV_8U,cv::Scalar(100));
参数CV_8U中的U代表unsigned,而S代表signed.对于三通道彩色图像可以用CV_8UC3。你也可以声明16或32位的整型三通道图像(如CV_16SC3)。

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

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

2、获取图像

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

3、显示图像

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

4、保存图像

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

5、复制

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

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

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

?
1
2
3
4
5
6
cv::Mat function() {
// create image
cv::Mat ima(240,320,CV_8U,cv::Scalar(100));
// return it
return ima;
}
在main函数中我们调用function():

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

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

 

6、IplImage和Mat转换

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

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

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

 

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

?
1
cv::Ptr<IplImage> iplImage = cvLoadImage( "c:\\img.jpg" );
但是,最好的方法还是直接采用cv::Mat来定义图像。

7、x,y轴的仿射变换

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

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

例程1:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/************************************************************************/
/* 打开并显示图像,并对图像进行关于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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值