您好,登錄后才能下訂單哦!
這篇文章主要介紹“怎么用C++ OpenCV制作電子相冊查看器”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“怎么用C++ OpenCV制作電子相冊查看器”文章能幫助大家解決問題。
我們想要一張張的查看文件夾下的圖片,第一步就得讀取將該文件夾下的所有圖片。
如上圖所示,為我創建的文件夾,該文件夾下有14張圖片。接下來我們就編寫代碼讀取該文件夾下的所有圖片。將讀取到的圖片存儲在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); }
現在我們已經有了images容器,其實再使用一個for循環就能夠一張張讀取容器里的圖片了。不過這樣只能一張張往下讀取,直到讀取完最后一張圖片程序結束。本案例的需求是使用鍵盤按鍵“->”向后讀取,“<-”向前讀取。
我們需要一張白色的畫布用來放置圖片。為了將所有圖片都居中在畫布中顯示,令畫布中心為(cx,cy),當前圖片寬width,高height。則該圖片相對于畫布起點為(x,y)。如下圖所示。
//將每一張照片放置畫布中心 int x = cx - (width / 2); int y = cy - (height / 2); //將照片摳圖到畫布上,此時照片位于畫布中心位置 images[index].copyTo(bg(Rect(x, y, width, height)));
在這里,使用一個判斷語句,判斷當前圖片尺寸是否大于畫布尺寸。如果當前圖片尺寸大于畫布尺寸,則將圖片自適應剪切。否則的話,會造成內存溢出。
//如果圖片過大,則對其進行裁剪 if (width > canvas.cols || height > canvas.rows) { //進行自適應剪切,每次只在原基礎上剪切百分之八十 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; }
根據上述代碼我們已經可以將圖片顯示在畫布中心了,接下來就需要使用鍵盤響應事件控制圖片查看。
我們使用方向鍵“->”控制向下查看,“<-”控制向上查看。具體請看源碼注釋。
if (key == 2424832) { //如果按動鍵盤‘←'鍵,則向前查看相片 if (index > 0)//如果圖片不是圖庫中第一張,則允許向前查看 { cout << "←" << endl; index--; } } else if (key == 2555904) { //如果按動鍵盤‘→'鍵,則向后查看相片 if (index < size-1)//如果圖片不是圖庫中最后一張,則允許向后查看 { cout << "→" << endl; index++; } } //如果按動鍵盤‘ESC'鍵,則退出程序 else if (key == 27) { break; }
如上圖所示,至此我們已經完成了案例所想要的效果。請參考源碼,注釋也比較詳細了。
#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); } //創建畫布,用于放置相片 Mat canvas = Mat(Size(1400, 900), CV_8UC3, Scalar::all(255)); //畫布中心 int cx = canvas.cols / 2; int cy = canvas.rows / 2; int size = images.size();//圖庫中相片數量 int index = 0; //當前圖庫中相片索引 while (true) { //waitKey無法正常捕捉方向鍵(上下左右),故使用waitKeyEx int key = waitKeyEx(0); if (key == 2424832) { //如果按動鍵盤‘←'鍵,則向前查看相片 if (index > 0)//如果圖片不是圖庫中第一張,則允許向前查看 { cout << "←" << endl; index--; } } else if (key == 2555904) { //如果按動鍵盤‘→'鍵,則向后查看相片 if (index < size-1)//如果圖片不是圖庫中最后一張,則允許向后查看 { cout << "→" << endl; index++; } } //如果按動鍵盤‘ESC'鍵,則退出程序 else if (key == 27) { break; } //將畫布拷貝一份,每經一次循環,更新一次圖片。 Mat bg = canvas.clone(); //計算每一張圖片的寬高 int width = images[index].cols; int height = images[index].rows; //如果圖片過大,則對其進行裁剪 if (width > canvas.cols || height > canvas.rows) { //進行自適應剪切,每次只在原基礎上剪切百分之八十 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; } //將每一張照片放置畫布中心 int x = cx - (width / 2); int y = cy - (height / 2); //將照片摳圖到畫布上,此時照片位于畫布中心位置 images[index].copyTo(bg(Rect(x, y, width, height))); imshow("Demo", bg); } destroyAllWindows(); system("pause"); return 0; }
關于“怎么用C++ OpenCV制作電子相冊查看器”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。