OpenCV——C++下的格式规范
考虑到现在网上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);