是否有可逆的方式将OpenCV cv::Mat对象转换为Eigen::Matrix?
例如,某种做法:
cv::Mat cvMat;
Eigen::Matrix eigMat;
camera->retrieve(cvMat);
// magic to convert cvMat to eigMat
// work on eigMat
// convert eigMat back to cvMat
imshow("Image", cvMat);Run Code Online (Sandbox Code Playgroud)
我已经尝试使用cv2eigen和eigen2cv,但由此产生的cvMat完全是错位的,我不知道是什么原因.尺寸是正确的,但图形完全被破坏,所以可能是每像素字节或数据大小问题?
我有几个存储在cv::Matwhere中的特征向量,每一行都是一个特征向量(这里有几行像这样:) [ x1 y1 x2 y2 x3 y3.... ].我必须在每个特征向量上应用SVD,为此我使用特征库.但是,在应用SVD之前,必须将特征矩阵转换为Eigen::Matrix形式.
后来,我必须将SVD结果转换回来cv::Mat.
任何人都可以建议一个很好的方法来做到这一点?我在cv::Mat表单中需要它的原因是因为我必须在OpenCV中将其输入到神经网络,并且只cv::Mat允许输入矩阵.
谢谢!!!
+我正在尝试用C++实现matlab算法.
这是matlab代码:
p = 3;
K = [3 4 5; 4 5 6; 7 8 9];
e = ones(p,1);
K2 = K - (1/p)*K*ones(p) - 1/p + (1/p^2)*sum(K(:))
[V_K,D_K] = eig(K2);
Run Code Online (Sandbox Code Playgroud)
虽然这是使用OpenCV的类似C++代码:
float data[] = {3, 4, 5,
4, 5, 6,
7, 8, 9};
cv::Mat m(3, 3, CV_32F, data);
float p = K.rows;
cv::Mat CK = K - (1/p)*K*cv::Mat::ones(p,p,CV_32F) - 1/p + (1/std::pow(p,2))*cv::sum(K)[0];
cv::Mat eigenvalues(1,p,CK.type()), eigenvectors(p,p,CK.type());
cv::eigen(CK,eigenvalues,eigenvectors);
Run Code Online (Sandbox Code Playgroud)
matlab代码打印:
CK =
4.3333 5.3333 6.3333
4.3333 5.3333 6.3333
4.3333 5.3333 6.3333
0.5774 …Run Code Online (Sandbox Code Playgroud)