2011-12-02 68 views

回答

1

CV_AA用於告知繪圖功能(即,line,circle,字體等)以執行消除鋸齒的繪圖;我不相信這是一個合適的數據類型Mat。正如您在core_c.h中看到的那樣,它在繪圖功能部分中定義。

你可以顯示你從哪裏接收這種數據類型的代碼?

編輯:我想我明白這是怎麼回事:)

鑑於CV_8U是這樣的:

#define CV_8U 0 

而且CV_MAKETYPE是:

#define CV_MAKETYPE(depth,cn) (CV_MAT_DEPTH(depth) + (((cn)-1) << CV_CN_SHIFT)) 

其中cn是多少的渠道,CV_CN_SHIFT是3.我打賭你看到的類型16實際上是

(0 + ((3 - 1) << 3)) -> 16或AKA CV_8UC3

所以,你有一個8bpp的RGB圖像不是CV_AA圖像:)

,需要在每個通道將從CV_8UCV_32F

編輯:看看使用cvSplitcvMerge(我沒有用的,而C接口,但它應該是類似以下內容):

IplImage* src = cvCreateImage(size, IPL_DEPTH_8U, 3); // CV_8UC3 
IplImage* r8u = cvClone(src); 
IplImage* g8u = cvClone(src); 
IplImage* b8u = cvClone(src); 

IplImage* dst = cvCreateImage(size, IPL_DEPTH_32F, 3); // CV_32F 
IplImage* r32f = cvClone(dst); 
IplImage* g32f = cvClone(dst); 
IplImage* b32f = cvClone(dst); 

// split the channels apart... 
cvSplit(src, b8u, g8u, r8u, NULL); // assuming in OpenCV BGR order here...may be RGB... 

// convert the data... 
cvConvertScale(b8u, b32f, 1, 0); 
cvConvertScale(g8u, g32f, 1, 0); 
cvConvertScale(r8u, r32f, 1, 0); 

// merge them back together again if you need to... 
cvMerge(r32f, g32f, b32f, NULL, dst); 
+0

哦~~我想你可能是正確的。但我怎麼轉換從CV_8U每個通道CV_32F? – Chris

+0

你的例子並不完全工作,但我試圖按摩它是有道理的...我從一個AVI文件與cvCreateFileCapture讀取,然後將IplImage *幀複製到一個CvMat對象(這是我需要的) 。然後嘗試像你列出的轉換,但沒有太多的運氣.. – Chris

+0

@Chris你得到它的工作?如果沒有,你可以用你的代碼片段更新你的答案,我會盡力幫助你。 – mevatron

1

呀,轉換類型之間使用cvConvertScale()並將scale參數設置爲和shift至。

一個不錯的宏是這樣的:

#define cvConvert(src, dst) cvConvertScale((src), (dst), 1, 0)