最近在學習毛星雲的《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)