opencv图像叠加

来源:互联网 发布:java available的用法 编辑:程序博客网 时间:2024/06/05 10:43

cmakelists:

cmake_minimum_required(VERSION 3.7)project(ROI)set(CMAKE_CXX_STANDARD 11)find_package(OpenCV REQUIRED)include_directories(${OpenCV_DIRS})set(SOURCE_FILES main.cpp)add_executable(ROI ${SOURCE_FILES})target_link_libraries(ROI ${OpenCV_LIBS})

程序:

#include <iostream>#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>using namespace std;using namespace cv;int main(){    //读入两张图像,原始图和logo图    Mat src_image1 = imread("ubuntu.png");    Mat logo_image = imread("2.png");    //通过Rect()指定一块ROI区域,注意这里是列和行,并且要跟要贴入的图像一样大小。这一步有点像建立一个指向特定区域的指针,因为=是浅复制    Mat ROI = src_image1(Rect(10, 20, logo_image.cols, logo_image.rows));    //Mat ROI = src_image1(Rect(10, 20, 100, 100));//像这样是不行的,大小必须对应好    //这里将logo_image复制给ROI就好了    logo_image.copyTo(ROI);    //ROI=logo_image.clone();//这种clone的方式不好用    imshow("图像叠加", src_image1);    waitKey(0);    //总体的流程就是定义一块ROI,然后把logo图copy至ROI就好了。    //addWeighted()函数,加权重叠    Mat src_image2 = imread("ubuntu.png");    Mat mclaren_image = imread("mclaren.jpg");    //这里输出一下尺寸和通道数,后面的函数要求通道数一样    cout<<src_image2.rows<<"*"<<src_image2.cols<<":"<<src_image2.channels()<<endl;    cout<<mclaren_image.rows<<"*"<<mclaren_image.cols<<":"<<mclaren_image.channels()<<endl;    Mat ROI2 = src_image2(Rect(10, 20, mclaren_image.cols, mclaren_image.rows));    //参数:第一幅图,第一幅图权重,第二幅图,第二幅图权重,0,重叠后输出到的图像    //注意这里的三幅图要大小要一样,通道数要一样,不然报错    //两幅图的权重相加要为1,效果就是两张图叠加时有渐显透明效果,如果一幅图为1了,那就是全覆盖    addWeighted(ROI2, 0.5, mclaren_image, 0.5, 0, ROI2);    imshow("图像叠加", src_image2);    waitKey(0);    return 0;}
原创粉丝点击