OpenCV(C++接口)學習筆記1-圖像的讀取、顯示、保存

jopen 10年前發布 | 88K 次閱讀 OpenCV 圖形/圖像處理

OpenCV在2.0版本之后添加了C++接口函數,之前學習的都是C語言的接口函數,現在OpenCV已經發展到2.4.9版本了,所以決定學習C++接口函數,跟上節奏。

1、創建圖像

cv::Mat image;
采用類cv::Mat來定義圖像變量或矩陣變量。

當然你也可以指定圖像的大小:

cv::Mat img(240,320,CV_8U,cv::Scalar(100));
參數CV_8U中的U代表unsigned,而S代表signed.對于三通道彩色圖像可以用CV_8UC3。你也可以聲明16或32位的整型三通道圖像(如CV_16SC3)。

我們可以通過調用size()函數可以獲取圖像的大小。

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

2、獲取圖像

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

3、顯示圖像

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

4、保存圖像

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

5、復制

在這里“=”運算符使得兩個圖像共享同一個數據,如果想要創建一個圖像并復制原圖像的數據到新的內存區域,則需要調用成員函數copyTo()。

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

所以我們可以放心地用函數返回一幅圖像:

cv::Mat function() {
// create image
cv::Mat ima(240,320,CV_8U,cv::Scalar(100));
// return it
return ima;
}
在main函數中我們調用function():

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

則gray與ima共享的是同一數據。

 

6、IplImage和Mat轉換

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

這種方式要注意調用cvReleaseImage(&iplImage);來釋放內存。

cv::Mat image4(iplImage,false);中的第二個參數的作用是說明是否復制圖像數據到新的內存區域,false則為否,true為是。如果選否,則兩幅圖像共用同一片內存區域。此時如果調用cvReleaseImage(&iplImage);則將會使得image4中的數據被釋放。

 

為防止忘記釋放內存,你可以采用以下方式來創建:

cv::Ptr<IplImage> iplImage = cvLoadImage("c:\\img.jpg");
但是,最好的方法還是直接采用cv::Mat來定義圖像。

7、x,y軸的仿射變換

cv::flip()函數進行仿射變換,函數的第三個參數取值:正則表示水平變化,0則表示垂直變化,負則兩個都變。

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

例程1:

/************************************************************************/
/* 打開并顯示圖像,并對圖像進行關于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;
}

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

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!