[英]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;
}
如果M
是Mat
類型的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.