轉載自:http://blog.csdn.net/szlcw1/article/details/37662935
OpenCV在2.0版本之後添加了C++接口函數,之前學習的都是C語言的接口函數,現在OpenCV已經發展到2.4.9版本了,所以決定學習C++接口函數,跟上節奏。
1、創建圖像
1
|
cv::Mat
image; |
當然你也可以指定圖像的大小:
1
|
cv::Mat
img(240,320,CV_8U,cv::Scalar(100)); |
我們可以通過調用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; } |
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" ); |
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; } |