4.3.3 OpenCV 實現 高斯金字塔和拉普拉斯金字塔

守望者与托养者發表於2024-08-11

4.3.3 OpenCV 實現 高斯金字塔和拉普拉斯金字塔

參考教程:

影像處理中的高斯金字塔和拉普拉斯金字塔_拉普拉斯金字塔插入偶數行,偶數列也是用卷積演算法嗎-CSDN部落格

1. 安裝OpenCV

1.1 下載OpenCV

參考教程:

無法定位軟體包libjasper-dev的解決辦法-CSDN部落格

視覺slam14講ch5 opencv安裝 ubuntu20.04_libvtk5-dev-CSDN部落格

OpenCV提供了大量的開源影像演算法,是計算機視覺領域使用極廣的影像處理演算法庫。在Ubuntu系統下,OpenCV有從原始碼安裝和只安裝庫檔案兩種方式可以選擇:

(1)從原始碼安裝,是指從OpenCV網站下載所有的OpenCV原始碼,並在機器上編譯以便使用。好處是可以選擇的版本比較豐富,而且也能看到原始碼,不過需要花費一些編譯時間。

(2)只安裝庫檔案,是指透過Ubuntu安裝由Ubuntu社群人員已經編譯好的庫檔案,無須重新編譯一遍。

因為我們使用較新版本的OpenCV,所以必須選擇從原始碼安裝的方式來安裝它。一來,可以調整一些編譯選項,匹配程式設計環境(例如,需不需要GPU加速等);再者,可以使用一些額外的功能。OpenCV目前維護三個主要版本,分為OpenCV2.4系列、OpenCV 3系列和OpenCV 4系列。當前使用OpenCV 3系列。

從如下網站中下載原始碼:

Releases - OpenCV

頁面下滑,選擇OpenCV – 3.4.16版本,點選”Sources“進行下載

下載得到如下的壓縮包

opencv-3.4.16.zip檔案拖拽至虛擬機器的home資料夾下:

點選opencv-3.4.16.zip檔案,右鍵,選擇“提取到此處

1.2 配置依賴項並編譯

編譯之前,先來安裝OpenCV的依賴項:

rosnoetic@rosnoetic-VirtualBox:~$ sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"

rosnoetic@rosnoetic-VirtualBox:~$ sudo apt update

rosnoetic@rosnoetic-VirtualBox:~$ sudo apt upgrade

rosnoetic@rosnoetic-VirtualBox:~$ sudo apt-get install build-essential libgtk2.0-dev libvtk6-dev libjpeg-dev libtiff5-dev libjasper-dev libopenexr-dev libtbb-dev libcanberra-gtk-module

事實上,OpenCV的依賴項很多,缺少某些編譯項會影響它的部分功能。OpenCV在cmake階段檢查依賴項是否會安裝,並調整自己的功能。如果電腦上有GPU並且安裝了相關依賴項,OpenCV也會把GPU加速開啟。不過當前,上述依賴項已經足夠了。

安裝完依賴項後進行編譯:

rosnoetic@rosnoetic-VirtualBox:~$ cd opencv-3.4.16/

rosnoetic@rosnoetic-VirtualBox:~/opencv-3.4.16$ mkdir build

rosnoetic@rosnoetic-VirtualBox:~/opencv-3.4.16$ cd build/

rosnoetic@rosnoetic-VirtualBox:~/opencv-3.4.16/build$ cmake ..

接著進行編譯

rosnoetic@rosnoetic-VirtualBox:~/opencv-3.4.16/build$ make -j4

整個編譯過程大概需要二十分鐘到一小時不等。

make之後,呼叫sudo make installOpenCV安裝到電腦上。

rosnoetic@rosnoetic-VirtualBox:~/opencv-3.4.16/build$ sudo make install

2. 操作OpenCV影像

2.1 編寫use_resize函式

2.1.1 建立資料夾

透過終端建立一個名為use_resize的資料夾以儲存我們的VSCode專案,在/use_resize目錄下開啟vscode

rosnoetic@rosnoetic-VirtualBox:~$ mkdir -p use_resize

rosnoetic@rosnoetic-VirtualBox:~$ cd use_resize/

rosnoetic@rosnoetic-VirtualBox:~/use_resize$ code .

2.1.2 編寫原始碼

新建檔案use_resize.cpp

use_resize.cpp貼上如下程式碼並儲存(Ctrl+S)

// 匯入opencv庫
#include <opencv2/opencv.hpp>
// 匯入imgproc庫,該庫可以進行影像的相關處理,包括濾波,直方圖處理以及邊緣檢測等
#include <opencv2/imgproc/imgproc.hpp>
// 匯入opencv的核心庫,用於處理資料型別以及陣列矩陣等操作
#include <opencv2/core/core.hpp>

// 匯入string標頭檔案,用於記錄圖片路徑地址
#include <string>
// 使用名稱空間,這是因為string實際上是在std名稱空間下的
using namespace std;

// 定義圖片路徑,並使用string
string image_path = "./ubuntu.png";

int main(int argc, char * argv){

    // 使用cv::imread讀取灰度影像,並使用Mat進行接收
    cv::Mat image = cv::imread(image_path, 0);

    // 讀取原始影像的尺寸
    int rows = image.rows, cols = image.cols;
    
    // 使用cv::Mat建立目標影像矩陣,small_img表示縮小的圖片,big_img表示放大的圖片
    cv::Mat small_img, big_img;

    // 使用cv::Size函式設定影像尺寸,需要首先將rows轉化為浮點數型別,避免整型資料運算直接剔除小數部分
    cv::Size small_size(cvRound((float)rows/2), cvRound((float)cols/2));
    cv::Size big_size(cvRound((float)rows*2),cvRound((float)cols*2));

    // 使用resize函式進行圖片的轉換
    cv::resize(
        image, // 原始影像
        small_img, // 縮小後的影像
        small_size,   // 縮小的尺寸
        0,     // 水平方向上的縮小系數,取0表示自動計算
        0,     // 垂直方向上的縮小系數,取0表示自動計算
        cv::INTER_LINEAR     // 使用線性插值的方式
    );

    cv::resize(
        image, // 原始影像
        big_img,    // 放大後的影像
        big_size,    // 放大尺寸
        0,   // 水平方向上的放大係數,取0表示自動計算
        0,  //垂直方向上的放大係數
        cv::INTER_LINEAR
    );

    // 展示影像
    // 展示原始影像
    cv::imshow("原始影像",image);
    // 展示放大後的影像
    cv::imshow("放大後的影像",big_img);
    // 展示縮小後的影像
    cv::imshow("縮小後的影像", small_img);

    // 等待在視窗回車後,再關閉影像
    cv::waitKey();

    return 0;
}

2.2 新建CMakeLists.txt檔案

新建CMakeLists.txt檔案

CMakeLists.txt中新增如下內容:

# cmake需要指定使用的版本,當前使用2.8版本
cmake_minimum_required(VERSION 2.8)

# 為專案命名一個名稱
project(USE_RESIZE)

# 設定C++的版本,當前設定為C++11的版本,變數CMAKE_CXX_FLAGS是一個變數名稱,不需要雙引號
set(CMAKE_CXX_FLAGS, "-std=c++11")

# 我們的程式中使用了opencv庫,因此我們首先需要找到opencv
find_package(OpenCV REQUIRED)

# 將opencv的目錄OPENCV_INCLUDE_DIRS新增到當前的標頭檔案目錄中
include_directories(${OpenCV_INCLUDE_DIRS})

# 新增可執行檔案,並將該可執行檔案命名
add_executable(use_resize use_resize.cpp)

# 將可執行檔案和OpenCV的庫檔案進行連線,可執行檔案需要和可執行檔案進行連線
target_link_libraries(use_resize ${OpenCV_LIBS})

由於程式中使用了C++11標準(如nullptrchrono),因此需要設定編譯器set(CMAKE_CXX_FLAGS "-std=c++11")

2.3 cmake編譯

ctrl+alt+T開啟終端,執行如下指令進行cmake編譯

rosnoetic@rosnoetic-VirtualBox:~$ cd use_resize/

rosnoetic@rosnoetic-VirtualBox:~/use_resize$ mkdir build

rosnoetic@rosnoetic-VirtualBox:~/use_resize$ cd build/

rosnoetic@rosnoetic-VirtualBox:~/use_resize/build$ cmake ..

接著make對工程進行編譯

rosnoetic@rosnoetic-VirtualBox:~/use_resize/build$ make

2.4 執行

ubuntu.png檔案拖拽至use_resize/build資料夾下

進一步的呼叫可執行檔案:

rosnoetic@rosnoetic-VirtualBox:~/use_resize/build$ ./use_resize 

依次顯示如下內容:

相關文章