2013-02-18 2 views
0

У меня есть программа, в которой я вычисляю среднее значение кратных кадров, когда я сохраняю это среднее значение, которое является кадром. Я получил файл 965 КБ, но я делаю то же самое с SCILAB, основанный на OpenCV, я получаю 5.93 МБ, который звучит более логично. в любом случае я decid писать свой кадр, используя FWRITE и вот что сделал:Получение значений cv :: Mat

cv::Mat meanFrame= cv::Mat::zeros(height,width,CV_32FC3); 
cv::Mat frameR; 
FILE* inpR = NULL; 
...... //after calculating the meanFrame 
inpR = fopen("d:\\red.txt","wb+"); 
for(int row = 0; row < meanFrame.rows; ++row) { 
    for (int col = 0; col < meanFrame.cols; ++col) { 
     std::cout << meanFrame.at<cv::Vec3f>(row, col)[1] <<std::endl; 
     std::cout << meanFrame.at<cv::Vec3f>(row, col)[2] <<std::endl; 
     fwrite(&resultframe.at<cv::Vec3f>(row,col)[0],sizeof(float),1,inpR); 
    } 
} 
fcloseall(); 

Я могу видеть пф канал 1 и 2, но когда я OpenCV файл red.txt я получаю:

€€<€€<€€<€€<€€<€€<€€<€€<€€<€€<€€<€€<€€....... 

любой что я здесь отсутствует, после этого я хочу загрузить этот файл в SCILAB и сохранить файл как файл. Спасибо за помощь!

+4

вы пишете 32bit IEEE 754 двоичных значений с плавающей точкой в ​​файл (4 байта на поплавок), а не текстовое представление цифры. Я не знаю формат файла, но он может использовать текстовые номера, поэтому вы хотите использовать 'ostream' в файле и передавать в него числа (или конвертировать их в строки вручную и записывать их в файл). Если это так, вы должны также написать разделители (зависит от спецификации файла formt). – leemes

+0

@leemes спасибо за ваш ответ, он действительно работал с ostream, но я до сих пор не понимаю проблему – Engine

+1

Что вы ожидаете от 'fwrite'? Вы даете ему указатель данных и размер, информация о типе теряется в пути. Подходящей альтернативой (если вы настаиваете на использовании 'C' файла IO) будет' fprintf', эквивалент C++ 'fwrite' -' ostream :: write'. – filmor

ответ

2

Вы пишете двоичные данные - как поплавок хранится в памяти.

При просмотре файла (в редакторе или в командной строке) он считает, что это текстовые данные и пытается интерпретировать его как символы.

Если вам нужно прочитать эти значения в другую программу, то вы можете использовать FWRITE и Fread (хотя, возможно, есть проблема с порядка байт, если у вас есть другой ЦП)

Если вы просто хотите, чтобы увидеть результаты, или хотите немного больше работы, чтобы читать их в другую программу, вы можете просто напечатать значения с

printf("%f", resultframe.at<cv::Vec3f>(row,col)[0]); 
Смежные вопросы