⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bmpvec.cpp

📁 c language_ann.c语言编写的神经网络程序。目录ann下是专门针对神经网络的代码
💻 CPP
字号:
/*
 * public/ann/utils/bmpvec.h
 * 2004-05-17 by ShanLanshan
 *
 * 位图向量, 从位图中提取可供网络训练的向量
 */

#include "bmpvec.h"

namespace ann {

	/////////////////////////////////////////////////////////////
	//	class BmpVec
	/////////////////////////////////////////////////////////////
	BmpVec::BmpVec(): m_flag(0) { }

	BmpVec::~BmpVec() { }

	BmpVec::BmpVec(ann_int w, ann_int h, ann_int bitcount, ann_uint32 flag)
	{
		set_type(w, h, bitcount, flag);
	}

	bool BmpVec::set_type(ann_int w, ann_int h, ann_int bitcount, ann_uint32 flag)
	{
		ann_int size;
		bool triple = bitcount == 24 && !is_bw();

		size = w * h;

		if (is_abs()) {
			size += w * (h - 1);
			size += h * (w - 1);
		}

		if (triple)
			size += size << 1;	// size *= 3;

		m_vector.set_size(size);

		return true;
	}

	bool BmpVec::set_type(Bitmap *bmp, ann_uint32 flag)
	{
		assert(bmp != NULL);
		return set_type(
			bmp->get_width(),
			bmp->get_height(),
			bmp->get_bitcount(),
			flag);
	}

	IAnnVector *BmpVec::abstract_vector(Bitmap *bmp)
	{
		return abstract_vector(bmp, m_flag);
	}

	IAnnVector *BmpVec::abstract_vector(Bitmap *bmp, ann_uint32 flag)
	{
		assert(bmp != NULL);

		if (!set_type(bmp, flag))
			return NULL;

		ann_int w, h, b, cd, from, to, divlen, cv, uv, lv;
		ann_float v;
		w = bmp->get_width();
		h = bmp->get_height();
		b = bmp->get_bitcount();
		cd = bmp->get_color_division();
		if (flag & BMPVEC_FLAG_BW) {
			from = 3;
			to = 3;
		} else {
			from = 0;
			to = cd - 1;
		}

		i = 0;
		for (ann_int d=form; d<=to; ++d) {
			divlen = bmp->get_division_len(d);
			for (ann_int x=0; x<w; ++x) {
				for (ann_int y=0; y<h; ++y) {
					/* 取得图片像素值 */
					cv = bmp->get_pixel(x, y, d);
					v = ann_float(cv) / divlen;
					m_vector.set_element(i++, v);

					/* 取得图片相邻像素相对值 */
					if ((flag & BMPVEC_FLAG_ABS) && x && y) {
						lv = bmp->get_pixel(x - 1, y, d);
						uv = bmp->get_pixel(x, y - 1, d);
						v = ann_float(lv -cv) / divlen
						m_vector.set_element(i++, v);
						v = ann_float(uv -cv) / divlen
						m_vector.set_element(i++, v);
					}
				}
			}
		}
	}

	IAnnVector *BmpVec::abstract_vector(const char *file)
	{
		return abstract_vector(file, m_flag);
	}

	IAnnVector *BmpVec::abstract_vector(const char *file, ann_uint32 flag)
	{
		Bitmap bmp;
		if (!bmp.load_from_file(file))
			return NULL;

		return abstract_vector(&bmp, flag);
	}

} // namespace ann

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -