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; }
版權聲明:本文博客原創文章,博客,未經同意,不得轉載。