CNN-卷積核的可視化c++實現-Day 1

頭文件包含內容(部分):

typedef unsigned char u8;
typedef signed   char s8;
typedef unsigned int  u32;
typedef int           s32;
typedef float         f32;

typedef struct
{
	u8* data;
	s32 width;
	s32 height;
	s32 step;
}img_u8;

typedef struct
{
	f32* data;
	s32 width;
	s32 height;
	s32 step;
}img_f32;

#define random(x) (rand()%x)


實現部分:

卷積核初始化函數,產生0-1浮點數

void convInit(img_f32 * filterBox)
{
	srand((unsigned)time(NULL));
	s32 winSize = filterBox->height * filterBox->width;

	for (s32 i = 0; i < winSize; i++)
	{
		f32 s = random(100) / 100.f;
		filterBox->data[i] = s;
	}
}

爲了可視化,需要將f32轉換成u8,並利用opencv顯示:

void imgf2u(img_f32 * src, img_u8* dst)
{   
	s32 dataSize = src->width * src->height;
	f32 maxVal = 0.f;

	for (s32 i = 0; i < dataSize; i++)
	{
		maxVal = src->data[i] > maxVal ? src->data[i] : maxVal;
	}

	f32 factor = 255 / (maxVal + 0.001);

	for (s32 i = 0; i < dataSize; i++)
	{
		u8 tmp = static_cast<u8>(src->data[i] * factor);
		dst->data[i] = tmp;
	}
}


void showGrayImg(img_u8* src, string winName)
{
	Mat imgShow(src->height, src->width, CV_8UC1);
	imgShow.data = src->data;
	namedWindow(winName, 0);
	imshow(winName, imgShow);
	CV_WAIT;
}

結果如下:

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章