Эффективно перебирая изображение cvMat
Я пытаюсь перебрать несколько изображений и сравнить значения пикселей со значениями соответствующих изображений истинности земли. При этом, однако, использование памяти моего компьютера увеличивается очень быстро, и в конечном итоге программа падает, и я получаю эту ошибку:
OpenCV Error: Insufficient memory (Failed to allocate 259200 bytes) in unknown function, file C:\OpenCV2.3\modules\core\src\alloc.cpp, line 52
Основные подходы, которые я попробовал, приведены ниже. Я упускаю что-то, что вызывает это, и есть ли более эффективный способ сделать это?
Подход 1:
void calculateMetrics(cv::Mat gt_frame, cv::Mat result_frame){
rows = result_frame.rows;
cols = result_frame.cols;
int gt;
int res;
for(i = 0; i < rows; i++){
for(j = 0; j < cols; j++){
gt = gt_frame.at<uchar>(i, j);
res = result_frame.at<uchar>(i, j);
if((gt == 255) && (res == 255)) // True positive
tp++;
else if((gt == 0) && (res == 0)) // True negative
tn++;
else if((gt == 0) && (res == 255)) // False positive
fp++;
else if((gt == 255) && (res == 0)) // False negative
fn++;
}
}
}
Подход 2:
void calculateMetrics(cv::Mat gt_frame, cv::Mat result_frame){
rows = result_frame.rows;
cols = result_frame.cols;
uchar *gt;
uchar *res;
for(i = 0; i < rows; ++i){
gt = gt_frame.ptr(i);
res = result_frame.ptr(i);
for(j = 0; j < cols; ++j){
*gt++;
*res++;
if((*gt == 255) && (*res == 255)) // True positive
tp++;
else if((*gt == 0) && (*res == 0)) // True negative
tn++;
else if((*gt == 0) && (*res == 255)) // False positive
fp++;
else if((*gt == 255) && (*res == 0)) // False negative
fn++;
}
}
}
Телефонный код:
void EvaluationFramework::processResults(int video_num){
num_frames = getNumFrames(video_num);
for(j = 0; j < num_frames; j++){
gt_frame = getGroundTruthFrame(video_num, j);
result_frame = getResultFrame(video_num, j);
calculateMetrics(gt_frame, result_frame);
}
std::cout << "TP: " << tp << std::endl;
std::cout << "TN: " << tn << std::endl;
std::cout << "FP: " << fp << std::endl;
std::cout << "FN: " << fn << std::endl;
precision = getPrecision((double)tp, (double)fp);
recall = getRecall((double)tp, (double)fn);
fmeasure = getFmeasure(precision, recall);
std::cout << "Precision: " << precision << std::endl;
std::cout << "Recall: " << recall << std::endl;
std::cout << "F-Measure: " << fmeasure << std::endl;
insertResults(0, video_num, precision, recall, fmeasure);
}
Функции getGroundTruthFrame и getResultFrame просто считывают соответствующие изображения из папки, getPrecision, getRecall и getFmeasure выполняют довольно простые вычисления, а insertResults вставляет вычисленные значения в базу данных.