below you can find modified version of pd_caltech.cpp
(i added some code from library)
could you try it ( to investigate your problem and more importantly let us think about how to improve database module)
call it like
datasets-example-pd_caltech -p=E:/CaltechPedestrians/sets/set00/
pay attention /
should be in end of path
if the code run for you without problem you will see images of database (without extracting all of them to Hard Disk
thank you in advance
#include "opencv2/datasets/pd_caltech.hpp"
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
using namespace std;
using namespace cv;
using namespace cv::datasets;
Mat getImageFromSeq(String seqImagesPath, String seqName, int index);
int main(int argc, char *argv[])
{
const char *keys =
"{ help h usage ? | | show this message }"
"{ path p |true| path to dataset }";
CommandLineParser parser(argc, argv, keys);
string path(parser.get<string>("path"));
if (parser.has("help") || path=="true")
{
parser.printMessage();
return -1;
}
// Ptr<PD_caltech> dataset = PD_caltech::create();
// dataset->load(path);
// ***************
// dataset contains for each object its images.
// currently on loading extract all images to folder path/../images/
// For example, let output train size and first element of first object
// and number of it's images.
// printf("train size: %u\n", (unsigned int)dataset->getTrain().size());
// PD_caltechObj *example = static_cast<PD_caltechObj *>(dataset->getTrain()[0].get());
// printf("first train object:\n");
// printf("name: %s\n", example->name.c_str());
// printf("images number: %u\n", (unsigned int)example->imageNames.size());
// printf("first image name: %s\n", example->imageNames[0].c_str());
// printf("images were extracted to path/../images/\n");
for (int i = 0; i < 100; i++)
{
Mat test = getImageFromSeq(path, "V000.seq", i);
if (test.empty())
{
cout << "the specified file can't be opened, check the path";
return 1;
}
imshow("Test", test);
waitKey();
}
return 0;
}
Mat getImageFromSeq(String seqImagesPath, String seqName, int index)
{
Mat image;
int counter=0;
FILE *f = fopen((seqImagesPath + seqName).c_str(), "rb");
if (f != NULL)
{
#define SKIP 28+8+512
fseek(f, SKIP, SEEK_CUR);
unsigned int header[9];
size_t res = fread(header, 9, 4, f);
double fps;
res = fread(&fps, 1, 8, f);
fseek(f, 432, SEEK_CUR);
printf("width %u\n", header[0]);
printf("height %u\n", header[1]);
printf("imageBitDepth %u\n", header[2]);
printf("imageBitDepthReal %u\n", header[3]);
printf("imageSizeBytes %u\n", header[4]);
printf("imageFormat %u\n", header[5]);
printf("fps %f\n", fps);
printf("trueImageSize %u\n", header[8]);
unsigned int numFrames = header[6];
printf("numFrames %u\n", numFrames);
string ext;
switch (header[5])
{
case 100:
case 200:
ext = "raw";
break;
case 101:
ext = "brgb8";
break;
case 102:
case 201:
ext = "jpg";
break;
case 103:
ext = "jbrgb";
break;
case 001:
case 002:
ext = "png";
break;
}
for (unsigned int i = 0; i < numFrames; ++i)
{
unsigned int size;
res = fread(&size, 1, 4, f);
char imgName[20];
sprintf(imgName, "/%u.%s", i, ext.c_str());
// comment fseek and uncomment next block to unpack all frames
if (index == counter)
{
char *img = new char[size];
fread(img, size ...
(more)
are you able to debug it ?
there might be indeed a bug here, when n<=0 (it probably should not free namelist then), see man page
I haven't been able to debug it... i'll let you know if I make any progress today UPDATE: i commented out the free(namelist) from util.cpp and it fixed the error. however I am getting a segmentation fault now.
how many classes the caltech have ? I saw where it was written. person/person?/person-fa/people . right ?