Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ uchar型特征::矩阵和cv::Mat之间的转换_C++_Opencv_Eigen_Eigen3 - Fatal编程技术网

C++ uchar型特征::矩阵和cv::Mat之间的转换

C++ uchar型特征::矩阵和cv::Mat之间的转换,c++,opencv,eigen,eigen3,C++,Opencv,Eigen,Eigen3,我正在使用opencv2/core/Eigen.hpp测试Eigen-OpenCV。文件似乎缺乏 我可以将cv::Mat转换为矩阵 Matrix<float,Dynamic, Dynamic> im; cv::cv2eigen(cv::imread("lena.jpg", cv::IMREAD_GRAYSCALE), im ); 我认为问题在于dst仍然是一个cv32fMat。我怎样才能避开这个问题 如果图像类型为CV_32F,并且您只看到白色图像,则这表明图像的值不在范围[0,

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

我可以将cv::Mat转换为矩阵

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

我认为问题在于dst仍然是一个
cv32f
Mat。我怎样才能避开这个问题

如果图像类型为
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 );
这是第二个变量的输出(
#如果0
):


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

#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 );
$ ./a.out 
value range = [24, 247]
$ ./a.out
value range = [0.0941177, 0.968628]
cv::Mat dst,dst2;
cv::eigen2cv(im_inv,dst2);

dst2.convertTo(dst, CV_8UC1 );

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