簡體   English   中英

嘗試打印32位浮點圖像的像素值

[英]Trying to print the pixel values of 32bit floating point image

我正在嘗試打印32位浮點圖像的像素強度。 這是我正在使用的代碼。 通過在Matlab上看到它們,可以看到圖像中的兩種類型的值:NAN和浮點數。 該程序會加載圖像,但是在嘗試運行時會掛起。 誰能建議我出了什么問題。 謝謝你的幫助。

#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>

void printIplImage(const IplImage* src)
{
    int row = 0,col = 0;
    for(row = 0; row < src->height; row++)
    {
        for(col = 0; col < src->width; col++)
        {       
            printf("%f, ", ((float*)(src->imageData + src->widthStep*row))[col]);
        }
        printf("\n");
    }
}

int main(int argc, char** argv)
{
    IplImage *t3 = cvLoadImage("divimages1.tiff",CV_LOAD_IMAGE_UNCHANGED);

    printIplImage(t3);

    cvReleaseImage (&t3);
    return 0;
}

您確定圖像數據以32位浮點數加載嗎? 嘗試按此處所述明確進行轉換

如果您先檢查已加載圖像的數據類型,那將是很好的。 下面的代碼可以幫助您了解數據類型。 如果不是“ float”格式,則首先以其自己的格式提取pixel的值,然后再進行類型轉換 我之前也遇到過類似的問題,它對我有幫助。

這是一個方便的函數,可用於在運行時幫助您識別opencv矩陣。 我發現它至少對調試有用。

string type2str(int type) {
  string r;

  uchar depth = type & CV_MAT_DEPTH_MASK;
  uchar chans = 1 + (type >> CV_CN_SHIFT);

  switch ( depth ) {
    case CV_8U:  r = "8U"; break;
    case CV_8S:  r = "8S"; break;
    case CV_16U: r = "16U"; break;
    case CV_16S: r = "16S"; break;
    case CV_32S: r = "32S"; break;
    case CV_32F: r = "32F"; break;
    case CV_64F: r = "64F"; break;
    default:     r = "User"; break;
  }

  r += "C";
  r += (chans+'0');

  return r;
}

如果MMat類型的Mat ,則可以這樣稱呼它:

string ty =  type2str( M.type() );
printf("Matrix: %s %dx%d \n", ty.c_str(), M.cols, M.rows );

將輸出數據,例如:

Matrix: 8UC3 640x480 
Matrix: 64FC1 3x2 

暫無
暫無

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

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