CvMat類型16對應於「CV_AA」。這和CV_32F類型之間有一個簡單的轉換嗎?如何將CvMat從CV_AA類型轉換爲CV_32F
與cvCvtColor(cimg,gimg,CV_BGR2GRAY);
一樣的東西?
CvMat類型16對應於「CV_AA」。這和CV_32F類型之間有一個簡單的轉換嗎?如何將CvMat從CV_AA類型轉換爲CV_32F
與cvCvtColor(cimg,gimg,CV_BGR2GRAY);
一樣的東西?
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_8U
到CV_32F
。
編輯:看看使用cvSplit和cvMerge(我沒有用的,而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);
呀,轉換類型之間使用cvConvertScale()
並將scale
參數設置爲和shift
至。
一個不錯的宏是這樣的:
#define cvConvert(src, dst) cvConvertScale((src), (dst), 1, 0)
哦~~我想你可能是正確的。但我怎麼轉換從CV_8U每個通道CV_32F? – Chris
你的例子並不完全工作,但我試圖按摩它是有道理的...我從一個AVI文件與cvCreateFileCapture讀取,然後將IplImage *幀複製到一個CvMat對象(這是我需要的) 。然後嘗試像你列出的轉換,但沒有太多的運氣.. – Chris
@Chris你得到它的工作?如果沒有,你可以用你的代碼片段更新你的答案,我會盡力幫助你。 – mevatron