2012-10-29 67 views
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,所以除非我使用基於「新」的初始化,否則我不需要調用析構函數。是對的嗎?任何微調正確的方向將不勝感激!

回答

3

cv::Mat testMat = cv::Mat(1,4,CV_8U,p); 

CV_8U裝置8位無符號。如果將其更改爲

cv::Mat testMat = cv::Mat(1,4,CV_32S,p); 

它應該工作。另外,改變

unsigned int p[4] = {3,1,2,4}; 

unsigned char p[4] = {3,1,2,4}; 

應太

+0

CV_32S是一個32位整數,單信道,是正確的嗎?我對unsigned int類型感興趣。基本上,當我在MATLAB中使用我的算法時,我正在玩uint8,因此我需要保持它一樣。但爲解決方案+1)! - – ha9u63ar

+1

@jjabraham你爲什麼需要它是一個unsigned int?您可以保留uint8,只需將您的輸入更改爲uchar ... – Hammer

+0

嘿,男人!感謝您的回答......當我從CV_8U更改爲CV_32S時,它的工作原理就像是一種魔法,遺憾的是,如果聲明瞭unsigned char p而不是unsigned int p,它就不起作用。我認爲openCV中存在與精度相關的錯誤,或者在文檔中沒有正確說明。然而,+1,你已經解決了它與一個微不足道的變化! :) – ha9u63ar