CvMat 类型 16 对应于“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
是 channel 数,CV_CN_SHIFT
是 3。我打赌你看到的类型 16 实际上是
(0 + ((3 - 1) << 3)) -> 16
或又名 CV_8UC3
.
所以,您有一个 8bpp RGB 图像,而不是 CV_AA 图像:)
您需要将 CV_8U
中的每个 channel 进行转换至CV_32F
。
编辑:看看使用cvSplit和 cvMerge (我有一段时间没有使用C接口(interface)了,但应该是类似下面的东西):
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);
关于c - 如何将 CvMat 从类型 CV_AA 转换为 CV_32F,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8361232/