OpenCV初步


注:原創不易,轉載請務必註明原做者和出處,感謝支持!linux

一 寫在開頭

1.1 本文內容

本文的內容涉及了OpenCV 3.4.2在Ubuntu 16.04 LTS下的安裝,OpenCV中圖像的加載,顯示,修改和保存等。ios

二 涉及的API

本文中涉及到的OpenCV API以下。這裏只簡要歸納API的功能,API詳細用法請參閱權威的官方文檔。c++

  • Mat cv::imread(const String &filename, int flags = IMREAD_COLOR);

imread()用於讀取圖片文件,讀取到的圖片以Mat對象返回。filename爲圖片路徑名。flags用於控制圖片的讀取。若是讀取失敗,Mat.empty()會返回true,Mat.data會被設置爲NULL。ubuntu

  • void cv::namedWindow(const String &winname, int flags = WINDOW_AUTOSIZE);

namedWindow()用於建立window,建立的window能夠用做圖像(Mat對象)的placeholder。能夠理解爲window是用於盛放並顯示圖像的容器。winname是window的名字,winname會被imshow()方法引用。flags決定了window的類型,經常使用的取值爲WINDOW_AUTOSIZE。api

  • void cv::imshow(const String &winname, InputArray mat);

imshow()用於顯示圖像。winname是盛放圖像的window的名字,mat爲圖像對象。ide

  • void cv::cvtColor(InputArray src, OutputArray dst, int code, int dstCn = 0);

cvtColor()用於轉換圖片的顏色空間(color space),好比經常使用的RGB顏色空間等。src爲原圖像,dst爲轉換後的圖像,code表示顏色空間轉換代碼,好比COLOR_BGR2GRAY表示將RGB的彩色圖轉換成灰度圖。測試

  • bool cv::imwrite(const String &filename, InputArray img, const std::vector &params = std::vector ());

imwrite()用於將圖像寫入文件中。filename是文件名,img表示要被寫入文件的Mat對象,params表示參數向量。spa

  • int cv::waitKey(int delay = 0);

waitKey()用於等待按鍵按下事件。delay表示延遲的時間。c++11

三 OpenCV 3.4.2在Ubuntu 16.04 LTS下的編譯安裝

關於OpenCV的安裝請參考官方提供的文檔:Installation in Linux。我嘗試過在Ubuntu 16.04 LTS中編譯安裝最新的OpenCV 4.0版本,但在安裝過程當中出現了嚴重的錯誤,沒能成功安裝。在我將版本降至3.4.2時才成功。

四 OpenCV安裝測試與圖像的加載和顯示

4.1 安裝測試

下面這個小實例用於測試OpenCV是否成功安裝。之因此不一樣時使用using namespace stdusing namespace cv是由於OpenCV庫中有一些外部名和C++ STL中的名字衝突。

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

using namespace cv;

int main(int argc, char *argv[])
{
    Mat src = imread("../images/lena.jpg", IMREAD_COLOR);
    if (src.empty())
    {
        std::cout << "Could not load image..." << std::endl;
        return -1;
    }

    namedWindow("Test OpenCV Install", WINDOW_AUTOSIZE);
    imshow("Test OpenCV Install", src);

    waitKey(0);
    return 0;
}

使用下列命令來編譯上面的cpp文件。

g++ -g -Wall -std=c++11 Test-OpenCV-Install.cpp -o Test-OpenCV-Install `pkg-config --cflags --libs opencv`

若是一切無誤,使用命令./Test-OpenCV-Install運行可執行文件,能夠看到以下圖所示的結果。

4.2 圖像的加載和顯示

版本1

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

using namespace cv;

int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        printf("usage : DisplayImage.out <image_path>\n");
        return -1;
    }

    Mat img = imread(argv[1], IMREAD_COLOR);
    if (!img.data)
    {
        printf("No image data...\n");
        return -1;
    }
    namedWindow("Display Image", WINDOW_AUTOSIZE);
    imshow("Display Image", img);

    waitKey(0);
    return 0;
}

編譯並運行上述版本,結果以下。

版本2

#include <opencv2/opencv.hpp>
#include <iostream>
#include <string>

using namespace cv;

int main(int argc, char *argv[])
{
    // default image name
    std::string imgName("../images/lena.jpg");

    if (argc > 1)
        imgName = argv[1];

    // load image file
    Mat img = imread(imgName, IMREAD_COLOR);
    if (img.empty())
    {
        std::cout << "Could not load image..." << std::endl;
        return -1;
    }

    // create a image placeholder and show the image inside it
    namedWindow("Display Image", WINDOW_AUTOSIZE);
    imshow("Display Image", img);

    // wait for a key press
    waitKey(0);
    return 0;
}

編譯並運行上述版本,結果以下。

五 圖像的修改和保存

#include <opencv2/opencv.hpp>

using namespace cv;

int main(int argc, char *argv[])
{
    if (argc != 3)
    {
        std::cout << "usage : convert.out <src_img_path> <des_img_path>" << std::endl;
        return -1;
    }

    Mat src = imread(argv[1], IMREAD_COLOR);
    if (src.empty())
    {
        std::cout << "could not load image..." << std::endl;
        return -1;
    }

    Mat src_gray;
    cvtColor(src, src_gray, COLOR_BGR2GRAY);
    imwrite(argv[2], src_gray);

    namedWindow(argv[1], WINDOW_AUTOSIZE);
    namedWindow(argv[2], WINDOW_AUTOSIZE);
    imshow(argv[1], src);
    imshow(argv[2], src_gray);

    waitKey(0);
    return 0;
}

編譯並運行上述版本,結果以下。

六 參考資料

  1. OpenCV文檔
相關文章
相關標籤/搜索