簡體   English   中英

從OpenCV圖像打印像素值到屏幕

[英]Printing pixel values to screen from an opencv image

我一直嘗試在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");
}

那是為IPL_DEPTH_8U圖像,我懷疑它工作正常。 對於32個浮動圖像,我將指針更改為float *,並將printf中的說明符更改為'%f',這似乎不起作用。 怎么了?

這些是正確的指針和說明符嗎? 另外,用於16位帶符號整數和32位帶符號浮點數的指針和說明符也應該是什么?

謝謝。 我剛剛開始使用此網站,你們真棒!

您可以使用cvGet2D()執行以下操作:

CvScalar val = cvGet2D(img, y, x);

您必須從CvScalar要打印的值。 由於它基本上是double[4] ,所以我認為這不是問題。

查看 OpenCV常見問題解答。 特別是,請看“如何訪問矩陣元素?”。 部分。

這是我寫的一個小樣本,用於正確打印浮動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 )宏僅適用於單通道圖像,但它實際上是所有指針算法的簡寫形式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM