一、工具篇
工欲善其事,必先利其器。學習OpenCV,肯定少不於基本的編程工具與OpenCV庫。在Windows平台下你可以選擇Visual Studio、CodeBlock等,當然你也可以選擇在Linux平台,用VI、codeBlock都是可以的。編程平台的選擇看個人愛好以及項目的開發環境。然後是OpenCV庫,你可以在這裡下載到最新的版本:http://opencv.org/,最近的版本已經到了2.4.7,但是OpenCV2.0以上版本差別都不算太大。關於怎麼安裝OpenCV,本文就不再詳說了,此類教程實在太多,百度一下類似:VS2012+openCV2.4.6應該能找到你想要的結果。
二、第一個OpenCV程序
相比於“第一個C語言程序”或者“第一個Java程序”都以Hello,World!這種俗套的例程,我們的第一個OpenCV來顯示一幅自己喜歡的圖像。
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
int main()
{
cv::Mat image;
image=cv::imread("../cat.png");
cv::namedWindow("cat");
cv::imshow("cat",image);
cv::waitKey(5000);
return 0;
}
關於上面的程序有以下幾點要說明:
1,core.hpp於OpenCV的一些基礎數據結構相關,highgui.hpp和openCV的一些界面相關,如顯示圖像的窗口。
2,Mat是OpenCV裡最基本的一個類,它用來表示圖像。
3,imshow是用來顯示圖像的函數,它的C++接口是:
void imshow(const string& winname, InputArray mat);
第一參數是窗口名,第二個參數是要顯示的圖像。
4,與OpenCV相關於類或者函數都在CV命名空間裡。
5,想讓上面程序正確顯示出你的圖像,請把圖像放在正確的路徑,或者直接寫絕對路徑。
上面程序中已經用到了圖像的讀入函數imread、圖像的顯示函數imshow,那麼圖像的寫入函數imwrite就不會顯示陌生了。
imwrite("output.jpg",image);
它的第一個參數是寫圖像的路徑,第二個參數是要寫入的圖像。
三、創建一個圖像
在我們的第一個OpenCV程序中,用Mat來聲明了一個圖像,聲明後圖像的大上為0*0的,當然我們也可以初始化一個固定大小的圖像。
cv::Mat image(240,320,CV_8U,cv::Scalar(100));
上面的代碼創建了一個灰度圖像,大小是320*240,圖像上每個點的數據類型是無符號8位的,並用100填充所有像素點。
你可以把CV_8U換成CV_8U3來創建一個三通道的彩色圖像。或者用CV_16U創建無符號16位的。
四、賦值與復制
如果我們想得到一個圖像的副本並進行了下面的操作。
Mat newImage=Image;
如果我們對newImage進行修改或操作,則會直接影響Image圖像,因為newImage與Image共用了數據內容。
想要真正得到一個副本可以這樣做:
Mat newImage;
Image.copyTo(newImage);//方法一
Mat newImage=image.clone();//方法二
很多時候,我們並不想得到原圖像的復制,但是要創建一個跟原圖像大小相同的圖像。下面的代碼可以完成這樣的功能。
Mat newImage;newImage.create(Image.size(),Image.type());