站点图标 AI技术聚合

OpenCV常用的交互操作—图像的输出(2)

OpenCV常用的交互操作—图像的输出(2)
一、图像的输出
  1. namedWindows函数用于创建一个窗口
    .

若是简单的图片显示,则不用调用namedWindow函数。直接imread读取图片,inshow显示图片即可。若需要在显示图片之前就用到窗口名时,比如我们后面会讲到的滑动条的使用,要指定滑动条依附在某个窗口上,就需要namedWindow函数先创建出窗口,显示的规定窗口名称。

1.1 namedWindow的函数原型:
void namedWindow(const string & winname, int flags=WINDOW_AUTOSIZE)
(1)参数一,const string& 型的name, 填写被用作窗口的窗口名称。
(2)参数二,int 类型的窗口标志,可以有以下几种值。

1.2 namedWindow函数有默认值WINDOW_AUTOSIZE,通常这个函数我们填一个变量就可以了。nameWindow的作用就是创建一个可以作为图片或滑动条的容器窗口。
如果具有相同名称的窗口已经存在,则函数不做任何事。我们可以调用destoryWindow()或destroyAllWindow()函数来关闭窗口,并取消之前分配的所有于窗口相关的内存空间。
但实际上,当代码量较少时,我们不需要手动调用这些函数来释放,因为退出时,所有资源和应用程序窗口都会被系统自动关闭。

2.输出图像到文件:imwrite()函数

2.1 imwrite的函数原型:
bool imwirte(const string& filename, InputArray img, const vector<int>& params=vector<int>());
(1)参数一:const strig& 类型的filename, 填写要写入的文件名,注意要带后缀,如“123.jpg”.
(2)参数二:InputArray类型的img, 填一个Mat类型的图像数据。
(3)参数三:const vector& 类型的params, 表示为特定格式保存的参数编码。它有默认的值vector(),通常不填写。如果要填写,有以下几个需要知道的地方:

imwite函数用于将图片保存到指定的文件。图像格式是基于文件扩展名的,可保存的扩展名和imread中可以读取的图像扩展名是一致的。

2.2 下面是imread函数用法的实例,生成一幅png图片。

#include <opencv2/opencv.hpp>
#include <vector>

using namespace std;
using namespace cv;

void createAlphaMat(Mat &mat)
{
    for(int i = 0; i < mat.rows; ++i)
    {
        for(int j = 0; j < mat.cols; ++j) {
            Vec4b& rgba = mat.at<Vec4b>(i,j);
            rgba[0] = UCHAR_MAX;  //red 255
            //aturate_cast函数的作用即是:当运算完之后,结果为负,则转为0,结果超出255,则为255。
            rgba[1] = saturate_cast<uchar>((float (mat.cols - j)) / (( float) mat.cols) * UCHAR_MAX); //groud
            rgba[2] = saturate_cast<uchar>((float (mat.rows - i)) / (( float)mat.rows) * UCHAR_MAX); //blue
            rgba[3] = saturate_cast<uchar>(0.5 * (rgba[1] + rgba[2])); //透明度
 
        }
    }
}

int main()
{
    cv::Mat image = cv::imread("../1.png");
    Mat mat(480, 640, CV_8UC4);  //创建一个640 * 480的3通道用于存放彩色图像。
    createAlphaMat(mat);  //带透明度的png图片

    vector<int> compression_params;
    compression_params.push_back(IMWRITE_PNG_COMPRESSION);
    compression_params.push_back(9);  //最佳质量

    try{
        imwrite("透明Alpha值图.png", mat, compression_params);
        imshow("生成的PNG图", mat);
        fprintf(stdout, "png图片的alpha数据保存完毕,生成了图片!\n");
        waitKey(0);
    }
    catch(runtime_error& ex) {
        fprintf(stderr, "图像转png错误:%s\n", ex.what());
        return 1;
    }
    
    return 0;
}

运行结果:

运行后生成的“透明Alpha值图.png”

3. 综合示例:图像的载入,显示和输出
演示如何载入图像,如何进行简单的图像混合,显示图像,并输出混合后的图像到jpg格式的文件中。
代码显示如下:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace std;
using namespace cv;

int main()
{
    Mat girl = imread("../girl.jpg"); //载入图像到Mat
    namedWindow("[1]动漫图"); //创建一个名为[1]动漫图的窗口
    imshow("[1]动漫图",girl); //显示名为[1]动漫图的窗口

    Mat image = imread("../1.jpg");
    Mat log = imread("../2.jpg");

    namedWindow("[2]原画图");
    imshow("[2]原画图", image);
    cout << "image.cols , image.rows" << image.cols << image.rows << endl;

    namedWindow("[3]logo 图");
    imshow("[3]logo图", log);
    cout << "log.cols , log.rows" << log.cols << log.rows << endl;
    

    // 定义一个Mat用于存放图像的ROI
    Mat  imageROI;
    //方法一
    imageROI = image(Rect(0, 0, log.cols, log.rows));
    // 方法二
    // imageROI = image(Range(350, 350 + log.rows), Range(800, 800 + log.cols));
    
    //将log加到原图上
    addWeighted(imageROI, 0.5, log, 0.3, 0, imageROI);

    namedWindow("[4]原画 + log图");
    imshow("[4]原画 + log图", image);

    imwrite("生成的图片.jpg" , image);
    waitKey(0);
    return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.6)
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
add_executable(ROI 2.cpp)
target_link_libraries(ROI ${OpenCV_LIBS})

达到效果

运行后生成的“生成的图片.jpg” 文件如下:

4. 下讲,我们就针对上述代码中图像的像素,图像的混合来开展对 图像中像素的操作,感兴趣区域(ROI)的设置和如何进行图形混合(addWeighted)的学习

文章出处登录后可见!

已经登录?立即刷新
退出移动版