系统: Ubuntu16.04
OpenCV版本: OpenCV3.2
语言: C++
IDE: Clion
——————————————————————————————————————————————————————————
图片二:最喜欢玩的LoL英雄-Zed
图片三:LoL网上找的小Logo
——————————————————————————————————————————————————————————
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!