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

 

posted @ 2016-09-27 09:26  铁杆  阅读(2489)  评论(0编辑  收藏  举报