1
我以前问过a question about matrix multiplication in OpenCV并设法找到正确的答案。然而,当我尝试这样做,我得到错误的结果:矩阵乘法使用cv ::垫
#include <iostream>
#include <cmath>
#include "opencv2/core/core.hpp"
using namespace std;
int main() {
// Vars.
int a[4] = {3,2,1,4};
int b[4] = {2,5,6,1};
// Pointers
int *p1, *p2;
int res(5);
// Init.
p1 = &a[0];
p2 = &b[0];
for(int i=0;i<4;i++) {
res += (*(p1+i) - 2)*(*(p2+i) - 3);
}
cout << res << endl; // This is fine!
unsigned int p[4] = {3,1,2,4};
cv::Mat testMat = cv::Mat(1,4,CV_8U,p);
cout << testMat << endl; // Shows [3, 0, 0, 0] !!!!!
cout << testMat.at<unsigned int>(0,3) << endl; // Displays 4
//cv::Mat resDot = testMat*(testMat.t());
cv::Mat testMatTransp(testMat.t());
cout << testMatTransp.at<unsigned int>(0,0) << endl; // Shows Jibrish 56928323
return(0);
}
除非我失去了一些东西,这可能应该正确打印出所有的信息,对不对?我应该调用任何析构函数或任何东西?我认为它基于RAII,所以除非我使用基于“新”的初始化,否则我不需要调用析构函数。是对的吗?任何微调正确的方向将不胜感激!
CV_32S是一个32位整数,单信道,是正确的吗?我对unsigned int类型感兴趣。基本上,当我在MATLAB中使用我的算法时,我正在玩uint8,因此我需要保持它一样。但为解决方案+1)! - – ha9u63ar
@jjabraham你为什么需要它是一个unsigned int?您可以保留uint8,只需将您的输入更改为uchar ... – Hammer
嘿,男人!感谢您的回答......当我从CV_8U更改为CV_32S时,它的工作原理就像是一种魔法,遗憾的是,如果声明了unsigned char p而不是unsigned int p,它就不起作用。我认为openCV中存在与精度相关的错误,或者在文档中没有正确说明。然而,+1,你已经解决了它与一个微不足道的变化! :) – ha9u63ar