Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.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++ cv::Mat到特征矩阵的转换和返回_C++_Opencv_Eigen_Eigen3 - Fatal编程技术网

C++ cv::Mat到特征矩阵的转换和返回

C++ cv::Mat到特征矩阵的转换和返回,c++,opencv,eigen,eigen3,C++,Opencv,Eigen,Eigen3,我在一个cv::Mat中存储了几个特征向量,其中每一行都是一个特征向量(这里有几行像这样:[x1 y1 x2 y2 x3 y3….])。我必须对每个特征向量应用奇异值分解,为此我使用特征库。但是,在应用SVD之前,必须将特征矩阵转换为Eigen::matrix形式 稍后,我必须将SVD结果转换回cv::Mat 谁能提出一个好的方法来做这件事?我在cv::Mat表单中需要它的原因是,我必须将它输入到OpenCV中的神经网络中,并且只允许cv::Mat输入矩阵 谢谢 尝试使用以下代码将本征值转换为c

我在一个
cv::Mat
中存储了几个特征向量,其中每一行都是一个特征向量(这里有几行像这样:
[x1 y1 x2 y2 x3 y3….]
)。我必须对每个特征向量应用奇异值分解,为此我使用特征库。但是,在应用SVD之前,必须将特征矩阵转换为
Eigen::matrix
形式

稍后,我必须将SVD结果转换回
cv::Mat

谁能提出一个好的方法来做这件事?我在
cv::Mat
表单中需要它的原因是,我必须将它输入到OpenCV中的神经网络中,并且只允许
cv::Mat
输入矩阵


谢谢

尝试使用以下代码将本征值转换为cv:

template<typename _Tp, int _rows, int _cols, int _options, int _maxRows, int _maxCols>
void eigen2cv(const Eigen::Matrix<_Tp, _rows, _cols, _options, _maxRows, _maxCols>& src, cv::Mat& dst)
{
    if (!(src.Flags & Eigen::RowMajorBit))
    {
        cv::Mat _src(src.cols(), src.rows(), cv::DataType<_Tp>::type,
            (void*)src.data(), src.stride() * sizeof(_Tp));
        cv::transpose(_src, dst);
    }
    else
    {
        cv::Mat _src(src.rows(), src.cols(), cv::DataType<_Tp>::type,
            (void*)src.data(), src.stride() * sizeof(_Tp));
        _src.copyTo(dst);
    }
}
来源:这段代码取自OpenCV本身,他们在内部使用它,因为OpenCV可以在内部将libeigen用于某些任务。我不明白为什么到这样的libs和Qt的格式转换没有通过API公开。

下面是一个例子:

#包括
cv::Mat_uA=Mat_uuA::ones(2,2);
本征矩阵b;
cv2eigen(a,b);
另外,还有一个使用Eigen::Map的解决方案。

看看这篇文章。它描述了如何以较少的开销映射数据。在最简单的情况下,根本就没有副本。它还处理本征表达式:

// Unsharp mask
Eigen::ArrayXXd img, blur;    
eigen2cv(img) = cv::imread("lena.jpg");
cv::GaussianBlur(eigen2cv(img), eigen2cv(blur));

cv::imshow("sharpened", eigen2cv(1.5 * img - 0.5 * blur));

谢谢你的建议!你能告诉我这里的“模板”是什么吗?我还没有达到高级水平。。。以及如何将cv::Mat转换为Egenen::Matrix…感谢您的输入@ypnosand这个“typename\u Tp”和数据类型是什么请再解释一点…这非常重要…你需要自己学习模板。但是使用此代码相当容易,并且不涉及模板。例如:cv::Mat_uuSrc;特征::MatrixXf dest(src.rows,src.cols);cv2eigen(src、dest);我试试这个!请告诉我这个“类型名”和数据类型是什么…我不明白。。。谢谢你@阅读你最喜欢的关于C++模板的书。这是非常基础的C++概念!关于数据类型,请参阅的可能重复项。无需复制数据,使用Eigen::Map。看看这里的答案:他们认为您在博客中谈论的新头文件与OpenCV 2.4.9不兼容。我刚刚包括了标题Eigen2CV.h,g++抛出了一系列奇怪的错误。
#include <opencv2/core/eigen.hpp>
cv::Mat_<float> a = Mat_<float>::ones(2,2);
Eigen::Matrix<float,Dynamic,Dynamic> b;
cv2eigen(a,b);
// Unsharp mask
Eigen::ArrayXXd img, blur;    
eigen2cv(img) = cv::imread("lena.jpg");
cv::GaussianBlur(eigen2cv(img), eigen2cv(blur));

cv::imshow("sharpened", eigen2cv(1.5 * img - 0.5 * blur));