最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于C++ OpenCV制作電子相冊(cè)查看器

 更新時(shí)間:2022年01月17日 08:28:58   作者:Zero___Chen  
這篇文章主要介紹了如何使用OpenCV C++ 制作電子相冊(cè)查看器。類(lèi)似于win10系統(tǒng)的“照片”功能。感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

前言

本文將使用OpenCV C++ 制作電子相冊(cè)查看器。類(lèi)似于win10系統(tǒng)的“照片”功能。接下來(lái)就具體來(lái)看看是如何一步步的實(shí)現(xiàn)吧。

一、圖片讀取

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

如上圖所示,為我創(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)。如下圖所示。

    //將每一張照片放置畫(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;
    }

四、效果顯示

如上圖所示,至此我們已經(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;
}

總結(jié)

本文使用OpenCV C++ 制作電子相冊(cè)查看器,類(lèi)似win10系統(tǒng)下的“照片”功能,關(guān)鍵步驟有以下幾點(diǎn)。

1、圖片在畫(huà)布上居中顯示

2、使用鍵盤(pán)響應(yīng)事件控制相片上下讀取

到此這篇關(guān)于基于C++ OpenCV制作電子相冊(cè)查看器的文章就介紹到這了,更多相關(guān)C++ OpenCV電子相冊(cè)查看器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 實(shí)例講解在C++的函數(shù)中變量參數(shù)及默認(rèn)參數(shù)的使用

    實(shí)例講解在C++的函數(shù)中變量參數(shù)及默認(rèn)參數(shù)的使用

    這篇文章主要介紹了在C++的函數(shù)中變量參數(shù)及默認(rèn)參數(shù)的使用,是C++函數(shù)入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2016-01-01
  • C/C++經(jīng)典實(shí)例之模擬計(jì)算器示例代碼

    C/C++經(jīng)典實(shí)例之模擬計(jì)算器示例代碼

    最近在看到的一個(gè)需求,本以為比較簡(jiǎn)單,但花了不少時(shí)間,所以下面這篇文章主要給大家介紹了關(guān)于C/C++經(jīng)典實(shí)例之模擬計(jì)算器的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-10-10
  • 如何應(yīng)用C++的函數(shù)對(duì)象

    如何應(yīng)用C++的函數(shù)對(duì)象

    C++函數(shù)對(duì)象是C語(yǔ)言程序的主要組成部分,一個(gè)函數(shù)可以調(diào)用其他函數(shù)。在設(shè)計(jì)良好的程序中,每個(gè)函數(shù)都有特定的目的。本文將介紹C++函數(shù)對(duì)象的應(yīng)用,有需要的可以參考學(xué)習(xí)。
    2016-08-08
  • Qt實(shí)現(xiàn)簡(jiǎn)易計(jì)時(shí)器的示例代碼

    Qt實(shí)現(xiàn)簡(jiǎn)易計(jì)時(shí)器的示例代碼

    計(jì)時(shí)器實(shí)現(xiàn)四個(gè)功能:開(kāi)始計(jì)時(shí)、停止計(jì)時(shí)、暫停計(jì)時(shí)以及打點(diǎn)。當(dāng)點(diǎn)擊暫停時(shí),開(kāi)始按鈕和停止按鈕無(wú)法點(diǎn)擊。當(dāng)點(diǎn)擊停止時(shí),開(kāi)始按鈕和暫停按鈕無(wú)法點(diǎn)擊,此時(shí)停止按鈕變?yōu)榍辶?。本文將用Qt實(shí)現(xiàn)這樣的一個(gè)計(jì)時(shí)器,需要的可以參考一下
    2022-06-06
  • 在Visual Studio中配置C++最新版netCDF庫(kù)的方法

    在Visual Studio中配置C++最新版netCDF庫(kù)的方法

    本文介紹在Windows電腦的Visual Studio軟件中,配置C++ 語(yǔ)言最新版netCDF庫(kù)的方法,文中通過(guò)圖文結(jié)合的形式介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2024-03-03
  • OpenCV實(shí)現(xiàn)馬賽克功能

    OpenCV實(shí)現(xiàn)馬賽克功能

    這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)馬賽克功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • 詳解C++字符串常用操作函數(shù)(查找、插入、截取、刪除等)

    詳解C++字符串常用操作函數(shù)(查找、插入、截取、刪除等)

    這篇文章主要介紹了C++字符串常用操作函數(shù)(查找、插入、截取、刪除等),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • IOS 開(kāi)發(fā)UITextView回收或關(guān)閉鍵盤(pán)

    IOS 開(kāi)發(fā)UITextView回收或關(guān)閉鍵盤(pán)

    這篇文章主要介紹了IOS 開(kāi)發(fā)UITextView回收或關(guān)閉鍵盤(pán)的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • opencv實(shí)現(xiàn)定時(shí)錄像功能

    opencv實(shí)現(xiàn)定時(shí)錄像功能

    這篇文章主要為大家詳細(xì)介紹了opencv實(shí)現(xiàn)定時(shí)錄像功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • C++數(shù)據(jù)結(jié)構(gòu)之哈希算法詳解

    C++數(shù)據(jù)結(jié)構(gòu)之哈希算法詳解

    這篇文章主要為大家詳細(xì)介紹了C++數(shù)據(jù)結(jié)構(gòu)中哈希算法的相關(guān)資料,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,希望對(duì)大家有所幫助
    2022-12-12

最新評(píng)論

海伦市| 城口县| 仁布县| 手机| 鄄城县| 道真| 兴城市| 玉龙| 阆中市| 沐川县| 五华县| 永寿县| 清镇市| 博兴县| 罗源县| 黔南| 江油市| 缙云县| 视频| 蒲江县| 邳州市| 那曲县| 桐城市| 纳雍县| 宝山区| 仲巴县| 依安县| 湛江市| 双鸭山市| 迁安市| 宁阳县| 平陆县| 吴川市| 海原县| 张家界市| 安丘市| 西安市| 张家口市| 长沙县| 准格尔旗| 湘潭市|