OpenCV圖像文件批量讀取編程實例
OpenCV編程實例之圖像文件批量讀取。
本博文摘錄《OpenCV圖像處理編程實例》2.4章節(jié),更詳細的內(nèi)容請參考本書。
在進行圖片序列處理時,我們常常需要讀取文件夾下的每一個圖片,然后再進行分析處理,因此需要對文件名連續(xù)及無規(guī)則情況分開討論。對于文件名連續(xù)的情況,文件讀取就簡單得多,可以利用sprintf函數(shù)實現(xiàn)在窗口中連續(xù)讀取同一文件夾下的圖片序列,而對于無規(guī)則的情況則可以采用基于C++下WIN32_ FIND_DATA文件的讀取方式。
2.4.6 圖像批量讀取——規(guī)則
文件名連續(xù)情況下的讀取如代碼2-32所示。
// 功能:代碼 2-32 文件名連續(xù)情況下
// 作者:朱偉 zhu1988wei@163.com
// 來源:《OpenCV圖像處理編程實例》
// 博客:http://blog.csdn.net/zhuwei1988
// 更新:2016-8-1
// 說明:版權(quán)所有,引用或摘錄請聯(lián)系作者,并按照上面格式注明出處,謝謝。//
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
int main()
{
// 定義相關(guān)參數(shù)
const int num = 4;
char fileName[50];
char windowName[50];
cv::Mat srcImage;
for (int i = 1; i <= num; i++)
{
// sprintf讀入指定路徑下圖片序列
sprintf_s(fileName, "..\\images\\test\\1 (%d).jpg", i);
sprintf_s(windowName, "NO%d", i);
// 按照圖像文件名讀取
srcImage = cv::imread(fileName);
if (!srcImage.data)
{
std::cout << "No data!" << std::endl;
return -1;
}
cv::namedWindow(windowName);
cv::imshow(windowName, srcImage);
std::cout << "NO: " << i << std::endl;
//cv::waitKey(0);
/* 該處可以添加處理步驟 */
}
cv::waitKey(0);
return 0;
}
第16行代碼利用sprintf將對應的圖像文件路徑轉(zhuǎn)換為char*,在這種文件名連續(xù)的時候可以選中文件夾中的所有圖像文件,然后用鼠標右鍵選定并重命名,鍵入1后,文件夾的所有文件自動命名為1 (k).jpg,其中k取值為1,2……然后就可以根據(jù)本方法進行批量讀取了。
2.4.7 圖像批量讀取——無規(guī)則
文件名無規(guī)則的情況讀取如代碼2-33所示。
// 功能:代碼 2-33 文件名無規(guī)則情況讀取
// 作者:朱偉 zhu1988wei@163.com
// 來源:《OpenCV圖像處理編程實例》
// 博客:http://blog.csdn.net/zhuwei1988
// 更新:2016-8-1
// 說明:版權(quán)所有,引用或摘錄請聯(lián)系作者,并按照上面格式注明出處,謝謝。//
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
#include <stdio.h>
#include <windows.h>
using namespace std;
// LPCWSTR轉(zhuǎn)string
std::string WChar2Ansi(LPCWSTR pwszSrc)
{
int nLen = WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, NULL, 0, NULL, NULL);
if (nLen <= 0) return std::string("");
char* pszDst = new char[nLen];
if (NULL == pszDst) return std::string("");
WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, pszDst, nLen, NULL, NULL);
pszDst[nLen - 1] = 0;
std::string strTemp(pszDst);
delete[] pszDst;
return strTemp;
}
// 利用winWIN32_FIND_DATA讀取文件下的文件名
void readImgNamefromFile(char* fileName, vector <string> &imgNames)
{
// vector清零 參數(shù)設(shè)置
imgNames.clear();
WIN32_FIND_DATA file;
int i = 0;
char tempFilePath[MAX_PATH + 1];
char tempFileName[50];
// 轉(zhuǎn)換輸入文件名
sprintf_s(tempFilePath, "%s/*", fileName);
// 多字節(jié)轉(zhuǎn)換
WCHAR wstr[MAX_PATH] = { 0 };
MultiByteToWideChar(CP_ACP, 0, tempFilePath, -1, wstr, sizeof(wstr));
// 查找該文件待操作文件的相關(guān)屬性讀取到WIN32_FIND_DATA
HANDLE handle = FindFirstFile(wstr, &file);
if (handle != INVALID_HANDLE_VALUE)
{
FindNextFile(handle, &file);
FindNextFile(handle, &file);
// 循環(huán)遍歷得到文件夾的所有文件名
do
{
sprintf(tempFileName, "%s", fileName);
imgNames.push_back(WChar2Ansi(file.cFileName));
imgNames[i].insert(0, tempFileName);
i++;
} while (FindNextFile(handle, &file));
}
FindClose(handle);
}
int main()
{
// 設(shè)置讀入圖像序列文件夾的路徑
char* fileName = "..\\images\\test\\";
std::vector <string> imgNames;
// 獲取對應文件夾下所有文件名
readImgNamefromFile(fileName, imgNames);
// 遍歷對應文件夾下所有文件名
for (int i = 0; i < imgNames.size(); i++)
{
cv::Mat img = cv::imread(imgNames[i]);
if (!img.data)
return -1;
/* 可添加圖像處理算法code*/
cv::imshow("im", img);
cv::waitKey(0);
}
return 0;
}
利用winWIN32_FIND_DATA讀取文件夾下文件的思路:首先轉(zhuǎn)換文件夾名,利用FindFirstFile獲取當前文件夾名的句柄;然后遍歷當前文件夾名下的所有文件,將得到的所有文件名稱轉(zhuǎn)換后賦值于圖像文件向量;最后遍歷完當前文件下的所有文件,生成相應圖像文件索引名稱,用于文件夾中所有圖像文件的讀取,在讀取單個圖像文件后可進行相關(guān)的圖像處理操作。
相關(guān)文章
C++實現(xiàn)讀入二進制數(shù)并轉(zhuǎn)換為十進制輸出
本文給大家介紹的是一則使用C++實現(xiàn)讀入二進制數(shù)并轉(zhuǎn)換為十進制輸出的代碼,實現(xiàn)起來其實非常簡單,C++本身就提供了二進制類庫的,大家看代碼吧,簡單又實用。2015-03-03
C++數(shù)據(jù)結(jié)構(gòu)之實現(xiàn)循環(huán)順序隊列
這篇文章主要介紹了 C++數(shù)據(jù)結(jié)構(gòu)之實現(xiàn)循環(huán)順序隊列的相關(guān)資料,需要的朋友可以參考下2017-01-01
C語言每日練習之統(tǒng)計文本單詞數(shù)及高頻詞
本文文大家準備了個C語言練習題:統(tǒng)計單詞數(shù)并找出頻率最高的單詞,文中的示例代碼講解詳細,對我們學習C語言有一定幫助,感興趣的可以了解一下2022-05-05
C++替換棧中和.data中的cookie實現(xiàn)步驟詳解
這篇文章主要介紹了C++替換棧中和.data中的cookie實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧2022-10-10

