我一直试图在C中使用OpenCV中的printf打印像素值,但我只是得到了垃圾值。如何将IPL_DEPTH_8U(8位无符号整数)图像打印到屏幕并将IPL_DEPTH_32F(32位浮点)图像打印到屏幕?贝娄是我正在使用的代码。这是错的吗?它可能是正确的,但我只是得到了我没想到的像素值:
这些是单通道图像btw:
for (y = 0; y < img->height; y++){
uchar *ptr = (uchar*)(img->imageData + y * img->widthStep);
for (x = 0; x < img->width; x++){
printf("%u, ", ptr[x]);
}
printf("\n");
}
那是IPL_DEPTH_8U图像,我怀疑它工作正常。对于32个浮点图像,我将指针更改为float *,将printf中的指定符更改为'%f',这似乎不起作用。有什么问题?
这些是正确的指针和说明符吗?此外,对于16位有符号整数和32位有符号浮点数,指针和说明符应该是什么?
感谢。我刚开始使用这个网站,你们真棒!
答案 0 :(得分:3)
您可以使用cvGet2D()
:
CvScalar val = cvGet2D(img, y, x);
您必须从CvScalar
中提取要打印的值。由于它基本上是double[4]
,我认为这不会是一个问题。
答案 1 :(得分:2)
查看this OpenCV常见问题解答。特别要看“如何访问矩阵元素?”部分。
这是我为正确打印float IplImage
结构而编写的一个小样本:
void fillIplImage(IplImage* srcdst)
{
for(int row = 0; row < srcdst->height; row++)
{
for(int col = 0; col < srcdst->width; col++)
{
((float*)(srcdst->imageData + srcdst->widthStep*row))[col] = (float)col;
}
}
}
void printIplImage(const IplImage* src)
{
for(int row = 0; row < src->height; row++)
{
for(int col = 0; col < src->width; col++)
{
printf("%f, ", ((float*)(src->imageData + src->widthStep*row))[col]);
}
printf("\n");
}
}
int main(int argc, char** argv)
{
CvSize sz = {10, 10};
IplImage* test = cvCreateImage(sz, IPL_DEPTH_32F, 1);
fillIplImage(test);
printIplImage(test);
cvReleaseImage(&test);
return 0;
}
还有CV_MAT_ELEM( matrix, elemtype, row, col )
宏仅适用于单通道图像,但它基本上是所有指针算法的简写。