[英]Conversion between Eigen::Matrix and cv::Mat of type uchar
我正在使用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。 我該如何解決這個問題。
如果圖像類型為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]
嘗試了一點之后,意識到如果我需要的是四舍五入,我可以使用convertTo()
cv::Mat dst,dst2;
cv::eigen2cv(im_inv,dst2);
dst2.convertTo(dst, CV_8UC1 );
cv::imshow( "win", dst );
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.