最近在学习毛星云的《opencv3编程入门》,书中给出了基于C++的opencv3的编程实现,在学习过程中有一些自己的心得和体会,并分别给出了C++和Python的实现代码。
图像的载入:imread()函数
Imread()函数用于读取文件中的图片到opencv中,opencv中imread()函数的原型如下:
Mat imread(const string& filename, int flags=1);
第一个参数filename是我们需要载入的图片的路径名,第二个参数flags是载入标识,用于指定加载图像的颜色类型,默认值为1。若flag>0,返回三通道的彩色图像,若flag=0,返回灰度图像,flag<0,返回带有透明度alpha通道的图像。
图像的显示:imshow()函数
Imshow()函数用于在指定的窗口显示一幅图像,函数原型如下:
void imshow(const string& winname, InputArray mat);
winname是要显示的窗口的名称,mat是要显示的图像。需要注意的是如果窗口是用WINDOW_AUTOSIZE(默认值)创建的,则图像显示原始大小,否则图像将进行缩放以适合窗口。
窗口的创建:namedWindow()函数
namedWindow()函数用于创建一个窗口,如果只是简单的显示图片,可以直接imread()读取图片,然后imshow()直接指定出窗口名即可,但是如果显示窗口钱就需要用到窗口名,这时候必须先用namedWindow()函数创建出窗口。namedWindow()的函数原型如下:
void namedWindow(const string&winname, int flags=WINDOW_AUTOSIZE);
Winname是我们创建的窗口的名称,flags是窗口标识,可以取以下的值:WINDOW_NORMAL表示用户可以改变窗口的大小;WINDOW_AUTOSIZE表示系统会自动调整大小以适应所显示的图像,用户不能随意更改大小;WINDOW_OPENGL表示窗口创建的时候会支持OpenGL。
图像的保存:imwrite()函数
Imwrite()函数用于将图像保存到指定文件,函数原型为:
void imwrite(const string& filename, InputArray img, const vector<int> ¶ms=vector<int>());
Filename是保存的文件名,img一般是需要保存的图像,通常是一个Mat类型的图像数据,params是以特定形式保存的参数编码,默认值为vector<int>(),一般情况下不用管这个参数。
简单的代码示例(基于C++)
#include "stdafx.h"
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
int _tmain(int argc, _TCHAR* argv[])
{
// 图像的载入和显示
Mat img = imread("lena_color.tiff");
namedWindow("lena彩色");
imshow("lena彩色", img);
// 简单的图像混合
Mat img1 = imread("lena_gray.bmp");
Mat ROI1, ROI2;
Mat img2 = Mat::zeros(400, 400, CV_8UC3);
ROI1 = img(Rect(50, 50, 400, 400));
ROI2 = img1(Rect(50, 50, 400, 400));
// 两个ROI进行叠加
addWeighted(ROI1, 0.3, ROI2, 0.5, 0.0, img2);
namedWindow("效果图");
imshow("效果图", img2);
// 保存图像
imwrite("叠加后图像.bmp", img2);
waitKey(0);
return 0;
}
简单的代码示例(基于Python)
# coding=UTF-8
import numpy as np
import cv2
# 图像的载入和显示
img = cv2.imread('lena_color.tiff')
img1 = cv2.imread('lena_gray.bmp')
cv2.namedWindow('lena_color')
cv2.imshow('lena_color', img)
# 简单的图像混合
ROI1 = img[50:450, 50:450]
ROI2 = img1[50:450, 50:450]
img2 = cv2.addWeighted(ROI1, 0.3, ROI2, 0.5, 0.0)
cv2.namedWindow("result")
cv2.imshow("result", img2)
# 图像的保存
cv2.imwrite('result.bmp', img2)
cv2.waitKey(0)