2011-12-14 50 views
0

我創建OpenCV矩陣:如何通過CV_MAT_ELEM在多通道矩陣中設置元素?

CvMat * src = cvCreateMat(1, 2, CV_32FC2); 

然後,我想設置元件列= 0,列= 1,通道= 1 據的documentation for CvMat 描述的例子中我試圖設置元件具有以下代碼:

CV_MAT_ELEM(*src, float, 0, 1 * 2 + 1) = 123; 

但是assert被解僱。
其原因是顯而易見的:

我們有以下的OpenCV的源defintions:

#define CV_MAT_ELEM_PTR_FAST(mat, row, col, pix_size) \ 
    (assert((unsigned)(row) < (unsigned)(mat).rows && \ 
      (unsigned)(col) < (unsigned)(mat).cols), \ 
    (mat).data.ptr + (size_t)(mat).step*(row) + (pix_size)*(col)) 

#define CV_MAT_ELEM(mat, elemtype, row, col)   \ 
    (*(elemtype*)CV_MAT_ELEM_PTR_FAST(mat, row, col, sizeof(elemtype))) 

在我的情況mat.cols == 2col == 1 * 2 + 1 == 3

什麼是錯:在OpenCV的源文件或斷言?
如何管理?
如何設置多通道矩陣的元素? 謝謝。

P.S. OpenCV開發者如果有人在這裏。
當我按「現在可以創建一個」來創建新帳戶來報告頁面http://opencv.willowgarage.com/wiki/Welcome?action=login中的錯誤時,我得到錯誤「未知操作newaccount」。

UPDATE:

我使用OpenCV的2.1。

回答

1

我身邊有使用工作的CV_MAT_ELEM

float * src_ptr = (float*)src->data.ptr; 
*(src_ptr + 1 * 2 + 1) = 123; 
0

不回答你的問題,而是一個很好的建議: 無論是文檔,也沒有源代碼是錯誤的。

但爲什麼不使用C++接口?我可以打賭你不使用C接口,因爲你真的需要它(你爲一些奇怪的嵌入式平臺構建,無法編譯C++)。

Mat src(1, 2, CV_32FC2); 

// isn't it nicer than CV_UGLY_AND_SCARY_MACRO()?  
src.at<Vec2f>(0,1)[1] = 123; // (0,1) means row 0, col 1. [1] means channel 1. 

EDIT

從OpenCV的:

對於單通道矩陣有一個宏CV_MAT_ELEM(矩陣,elemtype,行,列),即,對於32位浮點真正的矩陣

+0

該表單是Windows - 沒有問題。但是EmguCV內部使用C接口,並調查它的行爲。你能否澄清一下爲什麼doc和來源是一致的?你剛纔說沒有指出原因。謝謝。 – sergtk

+0

重新檢查總是很好。我知道這個宏是有效的,但OpenCV文檔爲這個問題提供了更多的信息 - 只有單通道!請參閱上面的編輯 – Sam

+0

該文檔說明如何在此處使用多聲道http://opencv.itseez.com/modules/core/doc/old_basic_structures.html?highlight=cvmat#CvMat - 請參閱多聲道註釋,當您說「單聲道只有「,你與文檔相矛盾! - doc中沒有這樣的限制。但是,鏈接到doc的示例不起作用。我不明白我的代碼有什麼問題。 – sergtk