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

标签 c opencv

CvMat 类型 16 对应于“CV_AA”。它和 CV_32F 类型之间是否有简单的转换?

cvCvtColor(cimg,gimg,CV_BGR2GRAY); 相同的东西

最佳答案

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是 channel 数,CV_CN_SHIFT是 3。我打赌你看到的类型 16 实际上是

(0 + ((3 - 1) << 3)) -> 16或又名 CV_8UC3 .

所以,您有一个 8bpp RGB 图像,而不是 CV_AA 图像:)

您需要将 CV_8U 中的每个 channel 进行转换至CV_32F

编辑:看看使用cvSplitcvMerge (我有一段时间没有使用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/

相关文章:

c - Scanf 在 do-while 循环中更改了错误的数组

opencv - 如何使用 opencv2.3 获取 r,g,b 值

opencv - 在 Ubuntu 11.10 上编译 OpenCV2.3.1 时出现奇怪的链接器错误

c++ - 在 malloc 导致崩溃后为数组赋值

c++ - OpenCV 3.1.0 :/usr/local/include/opencv2/legacy/legacy. hpp 无法编译

python - 在 ubuntu 中为 python 和 c++ 集成 opencv 3.0.0 并使用 cmake 构建库

opencv - 安卓 : linking to opencv results in SIGBUS (signal SIGBUS: illegal alignment) when exception is thrown

c - strcpy() 和字符串左移给出错误的结果

C - "Error: Invalid operands to binary != ..."

用 C 计算算法运行时间