cv::Mat GaborFeatures::detectImageFeatures(const std::string& filename) { cv::Mat img; cv::Mat tmp; cv::Mat histogram(1, orientationCount, CV_32FC1, 0.0f); img = loadImage(filename); cv::Mat maxVals(img.rows, img.cols, CV_32FC2, cv::Scalar(0, 0)); int i = 0; for (float orientation = 0; orientation < M_PI; orientation += M_PI / orientationCount, i++) { energyGabor(img, tmp, orientation); // histogram.at<cv::Scalar>(0, column) = cv::sum(tmp); for (int y = 0; y < img.rows; y++) { for (int x = 0; x < img.cols; x++) { if (tmp.at<float>(y, x) > maxVals.at<cv::Vec2f>(y, x)[0]) { maxVals.at<cv::Vec2f>(y, x)[0] = tmp.at<float>(y, x); maxVals.at<cv::Vec2f>(y, x)[1] = i; } } } } for (int y = 0; y < img.rows; y++) { for (int x = 0; x < img.cols; x++) { histogram.at<float>(0, (int) maxVals.at<cv::Vec2f>(y, x)[1]) += 1; } } return histogram; }
void dataSummary(const char dataName[], int *nSamples, int *nAttributes) { int targetIndex; Array<int> attNValues(1), hasMissingValues(1), isDiscrete(1); Array<double> maxVals(1), minVals(1); readDataInfo(dataName, nSamples, nAttributes, attNValues, hasMissingValues, isDiscrete, maxVals, minVals, &targetIndex); *nAttributes -= 1; // exclude target attribute return; }
cv::Mat GaborFeatures::detectImageFeatures(unsigned int imgNumber, unsigned int imgLabel) { cv::Mat img; cv::Mat tmp; cv::Mat histogram(1, orientationCount, CV_32FC1, 0.0f); std::stringstream filename; if(imgLabel >= imageFilePaths.size()) { std::cerr << "Label out of range!" << std::endl; exit(EXIT_FAILURE); } filename << imageFilePaths[imgLabel] << "image_" << std::setw(4) << std::setfill('0') << imgNumber << ".jpg"; img = loadImage(filename.str()); cv::Mat maxVals(img.rows, img.cols, CV_32FC2, cv::Scalar(0, 0)); int i = 0; for (float orientation = 0; orientation < M_PI; orientation += M_PI / orientationCount, i++) { energyGabor(img, tmp, orientation); // histogram.at<cv::Scalar>(0, column) = cv::sum(tmp); for (int y = 0; y < img.rows; y++) { for (int x = 0; x < img.cols; x++) { if (tmp.at<float>(y, x) > maxVals.at<cv::Vec2f>(y, x)[0]) { maxVals.at<cv::Vec2f>(y, x)[0] = tmp.at<float>(y, x); maxVals.at<cv::Vec2f>(y, x)[1] = i; } } } } for (int y = 0; y < img.rows; y++) { for (int x = 0; x < img.cols; x++) { histogram.at<float>(0, (int) maxVals.at<cv::Vec2f>(y, x)[1]) += 1; } } return histogram; }
// discardMissing means any data with 1 or more missing attributes will be // discarded. Note that this may make the dataset returned inconsistent // with what dataSummary() returns. Data* new_readData(const char dataName[], int discardMissing) { Data *data; int nSamples, nAttributes, targetIndex; Array<int> attNValues(1), hasMissingValues(1), isDiscrete(1); Array<double> maxVals(1), minVals(1); readDataInfo(dataName, &nSamples, &nAttributes, attNValues, hasMissingValues, isDiscrete, maxVals, minVals, &targetIndex); // nAttributes counts target as an attribute as well. // for class Data, we'll need to subtract 1 back off for data->nAttributes; // allocate space for and set up internals of data data = new Data(nSamples, nAttributes-1); // nAttributes-1 because class Data does not count // target as an attribute, whereas our file format does. assert(data != NULL); int dex=0; for (int att=0; att < nAttributes; att++) { if (att == targetIndex) { data->targetIsContinuous = !isDiscrete[att]; assert(!hasMissingValues[att]); // missing values not allowed in target // printf("[%d]", hasMissingValues[att]); data->targetNValues = attNValues[att]; } else { data->attIsContinuous[dex] = !isDiscrete[att]; data->hasMissingValues[dex] = hasMissingValues[att]; // printf("(%d)", hasMissingValues[att]); data->attNValues[dex] = attNValues[att]; dex++; } } assert(dex == nAttributes-1); // start reading the data char datFilename[4096]; strcpy(datFilename, DATADIR); strcat(datFilename, dataName); strcat(datFilename, "/"); strcat(datFilename, dataName); strcat(datFilename, ".dat"); // ".../data/foo/foo.dat" FILE *fp = safe_fopen(datFilename, "rt"); int sampleDex=0, nHasMissingAtt=0; for (int ctr=0; ctr < nSamples; ctr++) { int hasMissingAtt = readSample(fp, data, nAttributes, targetIndex, hasMissingValues, sampleDex); if (discardMissing && hasMissingAtt) nHasMissingAtt++; else sampleDex++; } fclose(fp); // If some samples were discarded, then shrink the datastructures to reflect // that we didn't actually get nSamples examples read in. if (!discardMissing) assert(nHasMissingAtt==0 && sampleDex==nSamples); if (discardMissing) { data->nSamples = nSamples - nHasMissingAtt; if (data->nSamples == 0) error("new_readData: After discarding missing, have no data left!"); for (int dex=0; dex < data->nAttributes; dex++) data->hasMissingValues[dex] = 0; Matrix temp(data->nSamples, data->nAttributes); for (int i=0; i < data->nSamples; i++) for (int j=0; j < data->nAttributes; j++) temp[i][j] = data->dataSample[i][j]; data->dataSample.resize(data->nSamples, data->nAttributes); data->dataSample = temp; } data->shuffleSample(); assert(data->nAttributes == nAttributes-1); return data; }