2012-01-17 207 views
3

矩陣乘法是圖像處理中的一項非常基本的任務,OpenCV負責處理重載的*運算符。點的STL向量可以通過轉換轉換爲Mat。矩陣乘法的Opencv STL矢量到矩陣

vector<Point2f> p1(2); 
p1[0].x=1;p1[0].y=0; 
p1[1].x=0;p1[1].y=1; 
Mat p1M=Mat(p1); 

如OpenCV的文檔中提到的,這將創建矩陣與單柱(用2個元件)行等於無載體的:

[1 0;0 1]------>p1M.rows=2;p1M.cols=1 

當你想矩陣這就產生了一個問題乘以(p1M * p1M)... [2x1] * [2x1] ??? ......基本上我相信Matrix所有的投射向量都是合併向量,因爲它是......

但是,命令p1M.at<float> (0,1)p1M.at<float> (1,0)分別返回0和1。這讓我想到P1M * P1M是可能的,但不幸的是它唯一的編譯和生成運行時錯誤:

OpenCV Error: Assertion failed (a_size.width == len) in gemm, file /home/james/OpenCV-2.3.1/modules/core/src/matmul.cpp, line 708 terminate called after throwing an instance of 'cv::Exception' what(): /home/james/OpenCV-2.3.1/modules/core/src/matmul.cpp:708: error: (-215) a_size.width == len in function gemm

我想到的是寫一個函數,只是這樣做的!矢量墊,反之亦然......我錯過了什麼?

+0

從斷言我猜想,矩陣是不從2×2的表格矢量內置轉換P1M到您所期待的矩陣。我建議你看看Mat控制器,看看如何設置矩陣給一個std:vector。 – boto

+1

我認爲你是對的,它會創建一個2 * 1矩陣,但它會創建一個雙通道2 * 1矩陣。這意味着矩陣中的每個元素不是一個浮點數,而是一個cv :: Vec2f。因此,如果您打印下列值:p1M.channels(),p1M.at (0,0)[0],p1M.at (0,0)[1],p1M.at (1,0)[ 0],p1M.at (1,0)[1],你應該得到2,1.0,0.0,0.0,1.0。我不認爲OpenCV的矩陣乘法支持多通道矩陣,這就是爲什麼你得到了錯誤信息。 – cxyzs7

+0

我推薦ImageWatch(VS插件)或調試器,你可以很容易地發現產生的Mat的類型。或者關注頻道的數量。 – Ela782

回答