Я переводя код, разработанный в MATLAB на C++, используя OpenCV. Я загружаю изображение в формате RGB, например:
Mat img;
img = imread('path to directory', CV_LOAD_IMAGE_COLOR);
Я просто хочу преобразовать это изображение в двойную точность, поскольку im2double()
делает это в MATLAB. Есть ли функция, которая позволяет это делать? Могу ли я использовать convertTo()
?
Я попытался сделать:
img.convertTo(img, CV_64FC3, 255.0);
Но это не работает. Не могли бы вы помочь мне?
ОБНОВЛЕНИЕ: Спасибо за ваши ответы. То, что я сейчас делаю, это что-то вроде
int i, k;
Mat img, img_dbprec;
img = imread('path to directory', CV_LOAD_IMAGE_COLOR); //Loads the image in the RGB format
img.convertTo(img_dbprec, CV_64FC3,1.0/255.0);//Convert image to double precision
for(i=0; i<img_dbprec.rows; i++){
for(k=0; k<img_dbprec.cols; k++){
cout << (double) img_dbprec.data[img_dbprec.step[0]*i + img_dbprec.step[1]* k + 0] << " ";
cout << (double) img_dbprec.data[img_dbprec.step[0]*i + img_dbprec.step[1]* k + 1] << " ";
cout << (double) img_dbprec.data[img_dbprec.step[0]*i + img_dbprec.step[1]* k + 2] << endl;
}
}
Мой результат (я просто поставлю окончательные значения):
...
150 150 150
21 21 21
85 85 85
214 213 213
22 22 22
22 22 22
214 213 213
85 85 85
21 21 21
что я не хочу. Можете ли вы сказать мне, что я делаю неправильно?
Кажется, что ваш масштабный коэффициент инвертирован. Пытаться:
Mat dimg;
img.convertTo( dimg, CV_64FC3, 1.0/255.0 );
Ваш подход правильный. однако 255,0, который вы вставили, не является максимальным значением матрицы RGB, а коэффициент масштабирования, согласно документации. Таким образом, вы, вероятно, умножаете все значения пикселей на 255, что выводит их из диапазона [0, 255]. Кроме того, (в зависимости от версии, которую вы используете) было бы безопаснее создать новое значение назначения
Mat doubleImg;
img.convertTo(doubleImage, CV_64FC3);
1.0/255.0
)? каков диапазон значений пикселей тогда?