考慮到現在網上OpenCV的教程基本都是基於C語言的,很少有針對於純C++的教程,於是買了一本書C++下的OpenCV准備學一下,規范一下編程風格,為以后做准備。這篇隨筆邊學邊寫。
1.加載圖像
新版的函數庫支持直接用Mat來讀取和操作圖像,這樣格式簡單清晰,在C++下,盡量拋棄原有的IplImage格式:
#include "stdafx.h" #include "cv.h" #include "highgui.h" #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { cv::Mat image; image = cv::imread("D:\\112.jpg"); if (image.empty()) { cout << "No image"; } else { cv::namedWindow("Original Image"); cv::imshow("Original Image", image); cout << "This image is " << image.rows << "x" << image.cols << endl; cv::waitKey(0); } return 0; }
重點函數: image = cv::imread("D://112.jpg",CV_LOAD_IMAGE_GRAYSCALE);//灰度圖像單通道
image = cv::imread("D://112.jpg",CV_LOAD_IMAGE_COLOR);//彩色圖像3通道
可以直接加載到圖像並輸出大小:

2.圖像的翻轉
在剛剛的函數后面加入如下代碼,可以新生成一個窗口並水平翻轉圖片,並將翻轉后的圖片存入路徑內。
cv::Mat flip_image; cv::flip(image, flip_image, 1);//>0水平;==0垂直 cv::namedWindow("The Flip Image"); cv::imshow("The Flip Image", flip_image); cv::waitKey(0); cv::imwrite("D:\\112flip.jpg", flip_image);
重點函數: cv::flip(image, flip_image, 1) ;正數代表水平180度,0代表90度,負數代表倒轉。
3.繪圖和文本寫入
cv::circle(image, cv::Point(175, 185), //圓心 155, //半徑 cv::Scalar(255, 255, 0),//顏色,(0,0,0)為黑 3); //厚度 cv::putText(image, "This is me.", //文本內容 cv::Point(80, 400), //起始點 cv::FONT_HERSHEY_PLAIN, //字體 2.0, // 字體大小 cv::Scalar(255,255,0),//顏色 2); //文本厚度
函數中的參數見注釋,除了畫圓,常見的還有橢圓(ellipse),線(line),矩形(rectangle)。

4.自定義操作區域
如要在圖片中只改變一小部分,則需要定義這片區域,如下是一個插入logo的例子:
cv::Mat image; image = cv::imread("D:\\112.jpg");//載入原圖像 cv::namedWindow("Image"); //建立窗口 cv::Mat logo; logo = cv::imread("D:\\year.jpg");//載入logo cv::Mat imageROI(image, //設定區域 cv::Rect(image.cols - logo.cols,//圖像最右邊 image.rows - logo.rows,//圖像最下邊 logo.cols, logo.rows));//區域大小 logo.copyTo(imageROI); //復制logo到區域中 cv::imshow("Image", image); cv::waitKey(0);

