如何将CvMat从CV_AA类型转换为CV_32F

时间:2011-12-02 19:00:36

标签: c opencv

CvMat类型16对应于“CV_AA”。这个和CV_32F类型之间有一个简单的转换吗?

cvCvtColor(cimg,gimg,CV_BGR2GRAY);一样的东西?

2 个答案:

答案 0 :(得分:1)

CV_AA用于告知绘图函数(即linecircle,字体等)以执行抗锯齿绘制;我不相信它是一个正确的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

编辑:看一下使用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);

答案 1 :(得分:1)

是的,要在不同类型之间进行转换,请使用cvConvertScale()并将scale参数设置为 1 ,将shift设置为 0 。< / p>

一个很好的宏是:

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