Преобразование между Eigen::Matrix и cv::Mat типа uchar

Я тестирую Eigen ‹--> OpenCV, используя opencv2/core/eigen.hpp. Документации видимо не хватает.

Я мог бы преобразовать cv::Mat в Matrix.

Matrix<float,Dynamic, Dynamic> im;
cv::cv2eigen(cv::imread("lena.jpg", cv::IMREAD_GRAYSCALE),  im );

После этого шага я выполняю некоторую обработку с плавающей запятой. Когда я конвертирую im обратно в cv::Mat и отображаю изображение, я вижу белое изображение.

cv::Mat dst;
cv::eigen2cv(im,dst);

cv::imshow( "win", dst );
cv::waitKey(0);

Я думаю, что проблема в том, что dst все еще является матом CV_32F. Как я могу обойти эту проблему.


person mkuse    schedule 25.03.2015    source источник


Ответы (2)


Если тип изображения CV_32F и вы видите только белое изображение, это говорит о том, что значения изображения не находятся в диапазоне [0, 1].

#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>

#include <Eigen/Core>
#include <opencv2/core/eigen.hpp>

#include <algorithm>
#include <iostream>

// ...

Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic> im;

#if 0
// Wrong value range; you'll see only a white image.
cv::cv2eigen( cv::imread( "lena.jpg", cv::IMREAD_GRAYSCALE ),  im );
#else
// This should work ok.
cv::Mat image;

cv::Mat1b image1b = cv::imread( "lena.jpg", cv::IMREAD_GRAYSCALE );
image1b.convertTo( image, CV_32F, 1./255. );
cv::cv2eigen( image, im );
#endif

// Your processing
// ...

cv::Mat1f dst;
cv::eigen2cv( im, dst );

// Check the value range.
float maxV = *( std::max_element( dst.begin(), dst.end() ) );
float minV = *( std::min_element( dst.begin(), dst.end() ) );
std::cout << "value range = [" << minV << ", " << maxV << "]" << std::endl;

cv::imshow( "dst", dst );
cv::waitKey( 0 );

Это результат первого варианта (#if 1):

$ ./a.out 
value range = [24, 247]

А это результат второго варианта (#if 0):

$ ./a.out
value range = [0.0941177, 0.968628]
person nils    schedule 25.03.2015

Попробовав немного, понял, что если все, что мне нужно, это округление, я могу использовать convertTo()

cv::Mat dst,dst2;
cv::eigen2cv(im_inv,dst2);

dst2.convertTo(dst, CV_8UC1 );

cv::imshow( "win", dst );
person mkuse    schedule 26.03.2015