【OpenCV学习】--Task2:图像的载入、显示、输出以及鼠标操作

一、环境

系统: Ubuntu16.04
OpenCV版本: OpenCV3.2
语言: C++
IDE: Clion

——————————————————————————————————————————————————————————

二、图片

图片一:女神汤唯
【OpenCV学习】--Task2:图像的载入、显示、输出以及鼠标操作_第1张图片

图片二:最喜欢玩的LoL英雄-Zed
【OpenCV学习】--Task2:图像的载入、显示、输出以及鼠标操作_第2张图片
图片三:LoL网上找的小Logo
【OpenCV学习】--Task2:图像的载入、显示、输出以及鼠标操作_第3张图片

——————————————————————————————————————————————————————————

三、代码

1. CMakeLists.txt:

cmake_minimum_required( VERSION 2.8 )
project( task2_imageProcessPrelimiinary )

set( CMAKE_BUILD_TYPE Release)
set( CMAKE_CXX_FLAGS "-std=c++11 -o3")

find_package( OpenCV 3.2 REQUIRED )
include_directories(${OpenCV_INCLUDE_DIRS})

add_executable( task2_imageProcessPrelimiinary test1.cpp )
target_link_libraries( task2_imageProcessPrelimiinary ${OpenCV_LIBS})

2. 源码test.cpp

#include 
#include 
#include 

using namespace cv;
int main( int argc, char** argv)
{
    /*************Part1 读取与显示图片****************/
    Mat tangWei = imread("/home/hri/Project/LearnOpenCV/task2_imagePprocessPreliminary/tangwei.jpg");// 读取图片
    namedWindow("中意",0); // 创建显示图片窗口的名字
    imshow("中意", tangWei);// 进行显示
    waitKey(0);// 0代表等待用户按键处罚程序继续运行


    /*************Part2 初级图像融合*****************/
    Mat img = imread("/home/hri/Project/LearnOpenCV/task2_imagePprocessPreliminary/Zed.jpeg");
    Mat logo = imread("/home/hri/Project/LearnOpenCV/task2_imagePprocessPreliminary/logo.jpeg");

    //先显示图片
    namedWindow("Zed");
    imshow("Zed",img);
    waitKey(0);

    namedWindow("Logo");
    imshow("Logo",logo);
    waitKey(0);
    //定义一个Mat的量来存放ROI
    Mat imageROI;

    imageROI = img(Rect(0, 800, logo.cols, logo.rows));// 函数参数介绍:图像左上角x坐标, 图像左上角y坐标, 宽度, 长度

    //将LOGO加到原图上去
    addWeighted(imageROI, 0.5, logo, 0.3, 0., imageROI);


    namedWindow("ZedWithLogo");
    imshow("ZedWithLogo", img);
    waitKey(0);

    /*************Part3 图像的输出******************/

    imwrite("WeEnjoyLoL byBingo.jpg", img);
    waitKey();

    return 0;


}

**补充:**关于鼠标操作,具体我也不知道有什么用,就权当熟悉了一下C++的知识吧!
源码:

#include 
#include 
#include 

using  namespace cv;

#define WINDOW_NAME "BINGOREN"

// --函数的申明
void on_MouseHandle( int event, int x, int y, int flags, void* param);
void DrawRectangle( Mat& img, Rect box);
void ShowHelpText();

// --全局变量的申明
Rect g_rectangle;
bool g_bDrawwingBox = false; // --是否进行绘制
RNG g_rng(12345);


// --main函数
int main( int argc, char** argv)
{
    // --参数准备
    g_rectangle = Rect(-1, -1, 0, 0);
    Mat srcImage(600, 800, CV_8UC3), tempImage;
    srcImage.copyTo(tempImage);

    g_rectangle = Rect(-1, -1, 0, 0);
    srcImage = Scalar::all(0);


    // --设置鼠标操作灰调函数
    namedWindow(WINDOW_NAME);
    setMouseCallback(WINDOW_NAME, on_MouseHandle, (void*)&srcImage);


    // -- 程序主循环
    while(1)
    {
        srcImage.copyTo(tempImage);// --复制原图到临时变量
        if( g_bDrawwingBox )
            DrawRectangle( tempImage, g_rectangle);// --标识符为真就进行绘制
        imshow(WINDOW_NAME, tempImage);
        if (waitKey(10) == 27) // --按下ESC键程序退出
            break;
    }
    return 0;
}

void on_MouseHandle(int event, int x, int y, int flags, void* param)
{
    Mat& image = *(Mat*) param;
    switch(event)
    {
        // --鼠标移动消息
        case EVENT_MOUSEMOVE:
        {
            if(g_bDrawwingBox)
            {
                g_rectangle.width = x - g_rectangle.x;
                g_rectangle.height = y - g_rectangle.y;
            }
        }
            break;

        // --左键按下
        case EVENT_LBUTTONDOWN:
        {
            g_bDrawwingBox = true;
            g_rectangle = Rect(x, y, 0, 0 );
        }
            break;

        // --右键抬起消息
        case EVENT_RBUTTONDOWN:
        {
            g_bDrawwingBox = false; // --置标识符为false
            // 对宽和高小于0的处理
            if (g_rectangle.width < 0)
            {
                g_rectangle.x += g_rectangle.width;
                g_rectangle.width *= -1;
            }

            if (g_rectangle.height < 0)
            {
                g_rectangle.y += g_rectangle.height;
                g_rectangle.height *= -1;
            }
            // --调用这个函数
            DrawRectangle( image, g_rectangle);
        }
            break;

    }

}

void DrawRectangle( Mat& img, Rect box)
{
    rectangle(img, box.tl(), box.br(), Scalar(g_rng.uniform(0,255), g_rng.uniform(0, 255), g_rng.uniform(0, 255)));
}

然后就是进行操作后的结果,如下图:

【OpenCV学习】--Task2:图像的载入、显示、输出以及鼠标操作_第4张图片
——————————————————————————————————————————————————————————

四、Bug以及调试

今天没有。

——————————————————————————————————————————————————————————

五、结果与总结

整体实现的还算不错!
重申,参考大佬的博客毛星云博客,学自己的OpenCV!

你可能感兴趣的:(OpenCV学习)