CvMat类型16对应于“CV_AA”。这个和CV_32F类型之间有一个简单的转换吗?
和cvCvtColor(cimg,gimg,CV_BGR2GRAY);
一样的东西?
答案 0 :(得分: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_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);
答案 1 :(得分:1)
是的,要在不同类型之间进行转换,请使用cvConvertScale()
并将scale
参数设置为 1 ,将shift
设置为 0 。< / p>
一个很好的宏是:
#define cvConvert(src, dst) cvConvertScale((src), (dst), 1, 0 )