2012-08-13 58 views
0

我有一個矩陣作爲「srcMat」,700x1大小。我用下面的命令給值一個空矩陣「dstMat」:矩陣全部爲零超過循環

cv::Mat dstMat (srcMat.rows, srcMat.cols, srcMat.type()); 

for (int i = 0; i < medianMat.cols ; i ++) 
{ 
    dstMat(cv::Range::all(), cv::Range(i*5+1, i*5+4)).setTo(srcMat.at<int>(i)); 
} 

但這裏的問題是:dstMat是全零之外(後)「for」循環,但循環中,它具有正是我想要的價值。這裏有什麼問題?提前謝謝了。

+0

你能提供更多關於什麼是dstMat,medianMat及其大小和數值的細節,以便我們可以運行該模塊並進行測試... – G453 2012-08-13 16:45:26

回答

0

我認爲問題在於,每次嘗試選擇一個範圍時,您都在使用只讀值。 所以你失去了所有的價值觀,沒有一個能夠通向真正的矩陣。

因爲它是寫OpenCV的文檔中,從operator()返回的值是const,所以你不能使用返回值編輯矩陣:

涼蓆::運算符()(範圍rowRange,範圍colRange)常量

但是,如果使用setTo的第二掩模參數,你應該沒有問題:

墊&墊:: setTo(常量標量& S,const的氈&掩模=墊()

EDIT

我會使用colRange用於複製和選擇列, 的以下代碼適用於我:

#include <opencv2/core/core.hpp> 
#include <iostream> 

int main(int argc, char** argv) 
{ 
    cv::Mat dstMat (3, 12, CV_32S); 

    for(int i = 0; i < 6; i++) 
    dstMat.colRange(2*i,2*i+2).setTo(i); 

    std::cout<< "Destination\n" << dstMat << std::endl; 
    return 0; 
} 

檢查它是否更改矩陣你也可以

+0

親愛的Kamyar,非常感謝您的回答。我嘗試了幾次在「setTo」中使用掩碼,但失敗了。你有任何示例代碼或建議如何使用它?我對OpenCV相當陌生。再次感謝你。帶着敬意。 – 2012-08-16 08:06:15

+0

創建蒙版需要更多的代碼,你應該把1放在你想要複製的地方,並把0放在你不想要的地方。我已經用colRange示例代碼編輯了我的答案,您可以嘗試查看它是否適用於您 – 2012-08-16 14:48:35

+0

親愛的Kamyar,非常感謝您的有用答案。帶着敬意。 – 2012-08-16 14:55:59