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


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


版權聲明:本文博客原創文章,博客,未經同意,不得轉載。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM