OpenCV 圖像加載和顯示

2018-08-28 15:33 更新

目標

在本教程中,您將學習如何:

源代碼

這里下載源代碼。

#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
#include <string>
using namespace cv;
using namespace std;
int main( int argc, char** argv )
{
    String imageName( "../data/HappyFish.jpg" ); // by default
    if( argc > 1)
    {
        imageName = argv[1];
    }
    Mat image;
    image = imread( imageName, IMREAD_COLOR ); // Read the file
    if( image.empty() )                      // Check for invalid input
    {
        cout <<  "Could not open or find the image" << std::endl ;
        return -1;
    }
    namedWindow( "Display window", WINDOW_AUTOSIZE ); // Create a window for display.
    imshow( "Display window", image );                // Show our image inside it.
    waitKey(0); // Wait for a keystroke in the window
    return 0;
}

代碼鏈接:點擊進入

說明

在OpenCV 2中,我們有多個模塊。每個人負責處理不同的區(qū)域或方法。您可以在這些教程本身的用戶指南的結(jié)構(gòu)中觀察到這一點。在您使用其中任何一個之前,您首先需要包含聲明每個單獨模塊內(nèi)容的頭文件。

你幾乎總是最終使用:

  • 核心部分,這里定義了圖書館的基本構(gòu)建塊
  • highgui模塊,因為它包含輸入和輸出操作的功能
#include < opencv2 / core.hpp >
#include < opencv2 / imgcodecs.hpp >
#include < opencv2 / highgui.hpp >
#include <iostream>
#include <string>

我們還包括iostream,以方便控制臺線路輸出和輸入。為了避免與其他庫的數(shù)據(jù)結(jié)構(gòu)和函數(shù)名沖突,OpenCV有自己的命名空間:cv。為了避免在每個這些cv ::關(guān)鍵字之前附加需要,您可以使用以下行在整個文件中導(dǎo)入命名空間:

using namespace cv;

對于STL庫也是如此(用于控制臺I / O)?,F(xiàn)在,我們分析一下主要功能。我們開始確保從命令行獲取有效的圖像名稱參數(shù)。否則默認拍照:“HappyFish.jpg”。

    String imageName( "../data/HappyFish.jpg" ); // by default
    if( argc > 1)
    {
        imageName = argv[1];
    }

然后創(chuàng)建一個Mat對象,它將存儲加載的圖像的數(shù)據(jù)。

    Mat image;

現(xiàn)在我們調(diào)用加載第一個參數(shù)(argv [1])指定的映像名稱的cv :: imread函數(shù)。第二個參數(shù)指定了我們想要的圖像的格式。這可能是:

  • IMREAD_UNCHANGED(<0)按原樣加載圖像(包括alpha通道(如果存在)
  • IMREAD_GRAYSCALE(0)將圖像作為強度加載
  • IMREAD_COLOR(> 0)以RGB格式加載圖像
    image = imread( imageName, IMREAD_COLOR ); // Read the file
注意
OpenCV支持圖像格式Windows位圖(bmp),便攜式圖像格式(pbm,pgm,ppm)和Sun光柵(sr,ras)。在插件的幫助下(您需要指定使用它們,如果您建立自己的庫,但是在我們出貨的包中,默認情況下)您也可以加載像JPEG(jpeg,jpg,jpe),JPEG 2000(jp2 - 代號為CMake的Jasper),TIFF文件(tiff,tif)和便攜式網(wǎng)絡(luò)圖形(png)。此外,OpenEXR也是一種可能性。

檢查圖像數(shù)據(jù)是否正確加載后,我們要顯示圖像,因此我們使用cv :: namedWindow函數(shù)創(chuàng)建一個OpenCV窗口。創(chuàng)建OpenCV后,它們將自動進行管理。為此,您需要指定其名稱,以及如何從大小角度處理其包含的圖像的更改??赡苁牵?/p>

  • 如果不使用Qt后端,WINDOW_AUTOSIZE是唯一支持的。在這種情況下,窗口大小將占據(jù)顯示的圖像的大小。不允許調(diào)整大??!
  • WINDOW_NORMAL在Qt你可以使用它來允許窗口調(diào)整大小。圖像將根據(jù)當前窗口大小自行調(diào)整大小。通過使用| 操作員還需要指定是否希望圖像保持其寬高比(WINDOW_KEEPRATIO)(WINDOW_FREERATIO)。
    namedWindow( "Display window", WINDOW_AUTOSIZE ); // Create a window for display.

最后,要使用新的圖像更新OpenCV窗口的內(nèi)容,請使用cv :: imshow函數(shù)。指定要更新的OpenCV窗口名稱和此操作期間要使用的映像:

    imshow( "Display window", image );                // Show our image inside it.

因為我們希望我們的窗口被顯示直到用戶按下一個鍵(否則程序會結(jié)束太快),所以我們使用cv :: waitKey函數(shù),其唯一的參數(shù)是等待用戶輸入需要多長時間毫秒)。零意味著永遠等待。

    waitKey(0); // Wait for a keystroke in the window

結(jié)果

  • 編譯代碼,然后運行可執(zhí)行文件,將圖像路徑作為參數(shù)。如果你在Windows上,可執(zhí)行文件當然也會包含一個exe擴展名。當然確保圖像文件靠近你的程序文件。
    ./DisplayImage HappyFish.jpg
  • 你應(yīng)該得到一個漂亮的窗口,如下所示:

OpenCV 圖像加載和顯示


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號