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;
}

發佈了17 篇原創文章 · 獲贊 57 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章