溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

怎么用C++?OpenCV制作電子相冊(cè)查看器

發(fā)布時(shí)間:2022-01-17 09:56:59 來(lái)源:億速云 閱讀:158 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要介紹“怎么用C++ OpenCV制作電子相冊(cè)查看器”的相關(guān)知識(shí),小編通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“怎么用C++ OpenCV制作電子相冊(cè)查看器”文章能幫助大家解決問(wèn)題。

一、圖片讀取

我們想要一張張的查看文件夾下的圖片,第一步就得讀取將該文件夾下的所有圖片。

怎么用C++?OpenCV制作電子相冊(cè)查看器

如上圖所示,為我創(chuàng)建的文件夾,該文件夾下有14張圖片。接下來(lái)我們就編寫(xiě)代碼讀取該文件夾下的所有圖片。將讀取到的圖片存儲(chǔ)在images容器。

    //讀取文件夾下所有圖片
    string filename = "images";
    vector<string>imageList;
    glob(filename, imageList);
    vector<Mat>images;
    for (int i = 0; i < imageList.size(); i++)
    {
        Mat img = imread(imageList[i]);
        images.push_back(img);
    }

現(xiàn)在我們已經(jīng)有了images容器,其實(shí)再使用一個(gè)for循環(huán)就能夠一張張讀取容器里的圖片了。不過(guò)這樣只能一張張往下讀取,直到讀取完最后一張圖片程序結(jié)束。本案例的需求是使用鍵盤(pán)按鍵“->”向后讀取,“<-”向前讀取。

二、圖片展示

我們需要一張白色的畫(huà)布用來(lái)放置圖片。為了將所有圖片都居中在畫(huà)布中顯示,令畫(huà)布中心為(cx,cy),當(dāng)前圖片寬width,高h(yuǎn)eight。則該圖片相對(duì)于畫(huà)布起點(diǎn)為(x,y)。如下圖所示。

怎么用C++?OpenCV制作電子相冊(cè)查看器

    //將每一張照片放置畫(huà)布中心
    int x = cx - (width / 2);
    int y = cy - (height / 2);
    //將照片摳圖到畫(huà)布上,此時(shí)照片位于畫(huà)布中心位置
    images[index].copyTo(bg(Rect(x, y, width, height)));

在這里,使用一個(gè)判斷語(yǔ)句,判斷當(dāng)前圖片尺寸是否大于畫(huà)布尺寸。如果當(dāng)前圖片尺寸大于畫(huà)布尺寸,則將圖片自適應(yīng)剪切。否則的話,會(huì)造成內(nèi)存溢出。

    //如果圖片過(guò)大,則對(duì)其進(jìn)行裁剪
    if (width > canvas.cols || height > canvas.rows)
    {
        //進(jìn)行自適應(yīng)剪切,每次只在原基礎(chǔ)上剪切百分之八十
        while (true)
        {
            resize(images[index], images[index], Size(0, 0), 0.8, 0.8, INTER_LINEAR);
            if (images[index].cols < canvas.cols&&images[index].rows < canvas.rows)
            {
                break;
            }
        }    
        width = images[index].cols;
        height = images[index].rows;
    }

三、鍵盤(pán)控制

根據(jù)上述代碼我們已經(jīng)可以將圖片顯示在畫(huà)布中心了,接下來(lái)就需要使用鍵盤(pán)響應(yīng)事件控制圖片查看。
我們使用方向鍵“->”控制向下查看,“<-”控制向上查看。具體請(qǐng)看源碼注釋。

    if (key == 2424832)
    {
        //如果按動(dòng)鍵盤(pán)‘←'鍵,則向前查看相片
        if (index > 0)//如果圖片不是圖庫(kù)中第一張,則允許向前查看
        {
            cout << "←" << endl;
            index--;
        }
    }
    else if (key == 2555904)
    {
        //如果按動(dòng)鍵盤(pán)‘→'鍵,則向后查看相片
        if (index < size-1)//如果圖片不是圖庫(kù)中最后一張,則允許向后查看
        {
            cout << "→" << endl;
            index++;
        }
    }
    //如果按動(dòng)鍵盤(pán)‘ESC'鍵,則退出程序
    else if (key == 27)
    {
        break;
    }

四、效果顯示

怎么用C++?OpenCV制作電子相冊(cè)查看器

如上圖所示,至此我們已經(jīng)完成了案例所想要的效果。請(qǐng)參考源碼,注釋也比較詳細(xì)了。

五、源碼

#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;

int main()
{
    //讀取文件夾下所有圖片
    string filename = "images";
    vector<string>imageList;
    glob(filename, imageList);
    vector<Mat>images;
    for (int i = 0; i < imageList.size(); i++)
    {
        Mat img = imread(imageList[i]);
        images.push_back(img);
    }

    //創(chuàng)建畫(huà)布,用于放置相片
    Mat canvas = Mat(Size(1400, 900), CV_8UC3, Scalar::all(255));
    //畫(huà)布中心
    int cx = canvas.cols / 2;
    int cy = canvas.rows / 2;
    
    int size = images.size();//圖庫(kù)中相片數(shù)量
    int index = 0; //當(dāng)前圖庫(kù)中相片索引
    
    while (true)
    {
        //waitKey無(wú)法正常捕捉方向鍵(上下左右),故使用waitKeyEx
        int key = waitKeyEx(0);

        if (key == 2424832)
        {
            //如果按動(dòng)鍵盤(pán)‘←'鍵,則向前查看相片
            if (index > 0)//如果圖片不是圖庫(kù)中第一張,則允許向前查看
            {
                cout << "←" << endl;
                index--;
            }
        }
        else if (key == 2555904)
        {
            //如果按動(dòng)鍵盤(pán)‘→'鍵,則向后查看相片
            if (index < size-1)//如果圖片不是圖庫(kù)中最后一張,則允許向后查看
            {
                cout << "→" << endl;
                index++;
            }
        }
        //如果按動(dòng)鍵盤(pán)‘ESC'鍵,則退出程序
        else if (key == 27)
        {
            break;
        }

        //將畫(huà)布拷貝一份,每經(jīng)一次循環(huán),更新一次圖片。
        Mat bg = canvas.clone();

        //計(jì)算每一張圖片的寬高
        int width = images[index].cols;
        int height = images[index].rows;

        //如果圖片過(guò)大,則對(duì)其進(jìn)行裁剪
        if (width > canvas.cols || height > canvas.rows)
        {
            //進(jìn)行自適應(yīng)剪切,每次只在原基礎(chǔ)上剪切百分之八十
            while (true)
            {
                resize(images[index], images[index], Size(0, 0), 0.8, 0.8, INTER_LINEAR);
                if (images[index].cols < canvas.cols&&images[index].rows < canvas.rows)
                {
                    break;
                }
            }    
            width = images[index].cols;
            height = images[index].rows;
        }

        //將每一張照片放置畫(huà)布中心
        int x = cx - (width / 2);
        int y = cy - (height / 2);
        //將照片摳圖到畫(huà)布上,此時(shí)照片位于畫(huà)布中心位置
        images[index].copyTo(bg(Rect(x, y, width, height)));

        imshow("Demo", bg);
    }

    destroyAllWindows();
    system("pause");
    return 0;
}

關(guān)于“怎么用C++ OpenCV制作電子相冊(cè)查看器”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI