【问题标题】:Conversion between Eigen::Matrix and cv::Mat of type ucharEigen::Matrix 和 uchar 类型的 cv::Mat 之间的转换
【发布时间】:2015-03-26 17:17:06
【问题描述】:

我正在使用opencv2/core/eigen.hpp 测试 Eigen OpenCV。文档似乎缺乏。

我可以将 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 Mat。我怎样才能解决这个问题。

【问题讨论】:

    标签: c++ opencv eigen eigen3


    【解决方案1】:

    如果图像类型是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]
    

    【讨论】:

      【解决方案2】:

      尝试了一下之后,意识到如果我只需要四舍五入我可以使用convertTo()

      cv::Mat dst,dst2;
      cv::eigen2cv(im_inv,dst2);
      
      dst2.convertTo(dst, CV_8UC1 );
      
      cv::imshow( "win", dst );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-14
        • 2019-07-25
        • 1970-01-01
        • 2013-05-04
        • 2017-10-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多