2016-01-19 6 views
0

Я использую Visual Studio 2010 с OpenCV 3.0. Я пытаюсь загрузить некоторые изображения из папки, но у меня возникают проблемы.Загрузка изображения из папки с использованием OpenCV 3.0 в Windows

Во-первых, у меня не было файла dirent.h, поэтому я загрузил его, чтобы получить структуры DIR * и «dirent *» для доступа к файлам. Кажется, все хорошо, но теперь, когда я добираюсь до линии

string fileName = in_file-> d_name;

Я обнаружил, что у меня нет доступа к имени файла.

У кого-нибудь есть мысли по этому поводу?

Это код:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/types.h> 
#include <opencv2/core/dirent.h> 

#ifdef _WIN32 
#include <io.h> 
#else 
#include <unistd.h> 
#endif 

#include <conio.h> 
#include <windows.h> 
#include <tchar.h> 
#include <stdio.h> 
#include <strsafe.h> 
#pragma comment(lib, "User32.lib") 

#include <errno.h> 
#include <iostream> 
#include <time.h> 
#include <limits.h> 
#include <fstream> 
#include <sys/stat.h> 

#include <opencv2/core.hpp> 
#include <opencv2/imgproc.hpp> 
#include <opencv2/imgcodecs.hpp> 
#include <opencv2/highgui.hpp> 
#include <opencv2/ml.hpp> 
#include <opencv2/opencv.hpp> 

using namespace cv; 
using namespace cv::ml; 
using namespace std; 

int patchWidth = 15; 
int patchHeight = 15; 


int main(int, char**) 
{ 
    string imagesPath = "Images"; 
    string resultsPath = "Patches"; 

      DIR* FD; 
      struct dirent* in_file; 

      if (NULL == (FD = opendir (imagesPath.c_str()))) 
      { 
       fprintf(stderr, "Error : Failed to open input directory\n"); 
       return 0; 
      } 

      while ((in_file = readdir(FD))) 
      { 
        /* On linux/Unix we don't want current and parent directories 
        * If you're on Windows machine remove this two lines 
        */ 
       //  if (!strcmp (in_file->d_name, ".")) 
       //   continue; 
       //  if (!strcmp (in_file->d_name, "..")) 
       //   continue; 

        /* Open directory entry file for common operation */ 
        /* TODO : change permissions to meet your need! */ 

        string fileName = in_file->d_name; 

        string pathFile = imagesPath; 
        pathFile.append("/"); 
        pathFile.append(fileName); 
        //pathFile.append(".jpg"); 
        Mat img = imread(pathFile.c_str()); 

Спасибо заранее.

ответ

3

для гораздо более простого решения, просто использовать cv::glob:

String imagesPath = "Images/*.png"; // it has filters, too ! 

vector<String> fn; 
glob(path, fn, true); // recursive, if you want 
for (size_t i=0; i<fn.size(); i++) 
{ 
    Mat img = imread(fn[i]); 
    ... 
} 
+1

Это не только проще, но это позволяет избежать необходимости линий для конкретных платформ, которые закомментированные в ОП. – Bampfer

+0

@berak Я попробовал ваше предложение, но даже входит в цикл «for». Я понимаю, что «путь» на самом деле «imagesPath», нет? – JoseleMG

+0

@JoseleMG «путь» - это папка с дополнительным фильтром для типов изображений, например * .jpg, если вы используете фильтр, он также будет игнорировать скрытые вещи, такие как «thumbs.db» на окнах – berak

Смежные вопросы