从opencv图像将像素值打印到屏幕

从opencv图像将像素值打印到屏幕,c,opencv,C,Opencv,我一直试图使用C中OpenCV中的printf将像素值打印到屏幕上,但我只得到了垃圾值。如何将IPL_DEPTH_8U(8位无符号整数)图像打印到屏幕,如何将IPL_DEPTH_32F(32位浮点)图像打印到屏幕?下面是我正在使用的代码。错了吗?这可能是正确的,但我只得到了我没有预料到的像素值: 顺便说一句,这些是单通道图像: for (y = 0; y < img->height; y++){ uchar *ptr = (uchar*)(img->imageData +

我一直试图使用C中OpenCV中的printf将像素值打印到屏幕上,但我只得到了垃圾值。如何将IPL_DEPTH_8U(8位无符号整数)图像打印到屏幕,如何将IPL_DEPTH_32F(32位浮点)图像打印到屏幕?下面是我正在使用的代码。错了吗?这可能是正确的,但我只得到了我没有预料到的像素值:

顺便说一句,这些是单通道图像:

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");
}
(y=0;yheight;y++)的
{
uchar*ptr=(uchar*)(img->imageData+y*img->widthStep);
对于(x=0;xwidth;x++){
printf(“%u”,ptr[x]);
}
printf(“\n”);
}
这是针对IPL_DEPTH_8U图像的,我怀疑它工作正常。对于32个浮点图像,我将指针更改为float*,将printf中的说明符更改为“%f”,但这似乎不起作用。怎么了

这些是正确的指针和说明符吗?另外,16位有符号整数和32位有符号浮点的指针和说明符应该是什么

谢谢。我刚开始使用这个网站,你们真是太棒了

您可以使用doing:

您必须从
CvScalar
中取出要打印的值。由于它基本上是双[4],我认为这不会是一个问题。

您可以使用doing:

您必须从
CvScalar
中取出要打印的值。由于它基本上是双[4],我认为这不会是一个问题。

查看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;
}
void fillIplImage(IplImage*srcdst)
{
对于(int row=0;rowheight;row++)
{
对于(int col=0;colwidth;col++)
{
((float*)(srcdst->imageData+srcdst->widthStep*行))[col]=(float)col;
}
}
}
无效打印图像(常量打印图像*src)
{
对于(int row=0;rowheight;row++)
{
对于(int col=0;colwidth;col++)
{
printf(“%f,”,((float*)(src->imageData+src->widthStep*行))[col]);
}
printf(“\n”);
}
}
int main(int argc,字符**argv)
{
CvSize sz={10,10};
IplImage*测试=cvCreateImage(sz,IPL_深度_32F,1);
填充物(试验);
印刷(试验);
cvReleaseImage(图像和测试);
返回0;
}
还有一个
CV\u MAT\u ELEM(矩阵、元素类型、行、列)
宏只适用于单通道图像,但它本质上是所有指针算法的简写。

查看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;
}
void fillIplImage(IplImage*srcdst)
{
对于(int row=0;rowheight;row++)
{
对于(int col=0;colwidth;col++)
{
((float*)(srcdst->imageData+srcdst->widthStep*行))[col]=(float)col;
}
}
}
无效打印图像(常量打印图像*src)
{
对于(int row=0;rowheight;row++)
{
对于(int col=0;colwidth;col++)
{
printf(“%f,”,((float*)(src->imageData+src->widthStep*行))[col]);
}
printf(“\n”);
}
}
int main(int argc,字符**argv)
{
CvSize sz={10,10};
IplImage*测试=cvCreateImage(sz,IPL_深度_32F,1);
填充物(试验);
印刷(试验);
cvReleaseImage(图像和测试);
返回0;
}
还有一个
CV\u MAT\u ELEM(矩阵、元素类型、行、列)
宏,它只适用于单通道图像,但它本质上是所有指针算法的缩写。

试试这个或这个。试试这个或这个。