使用cuda+opengl图形互操作性实现MPR

本文介绍了使用CUDA和OpenGL进行图形互操作性实现多平面重建(MPR)过程中遇到的问题和解决方案。重点在于HDR数据的读入、CUDA纹理的正确配置,以及CUDA与OpenGL资源绑定时的数据类型一致性。错误可能包括纹理数据类型不匹配、滤波模式设置错误、纹理坐标处理不当等。
摘要由CSDN通过智能技术生成

1. 读入hdr数据

void readData(char *filename, uint *sizes, float *dists, void **data)
{
	struct dsr hdr;
	FILE  *fp;
	int dataTypeSize = 0;
	char rawFilename[100];
	size_t size;


	if(!(fp=fopen(filename,"rb"))){ 
		perror("opening .hdr file failed");
		exit(1);	
	}
	fread(&hdr,sizeof(struct dsr),1,fp);
	fclose(fp);

	sizes[0] = hdr.dime.dim[1]; sizes[1] = hdr.dime.dim[2]; sizes[2] = hdr.dime.dim[3];
	dists[0] = hdr.dime.pixdim[1]; dists[1] = hdr.dime.pixdim[2]; dists[2] = hdr.dime.pixdim[3]; 

	dataTypeSize = sizeof(short);

	strcpy(rawFilename, filename);
	*strrchr(rawFilename, '.') = 0;
	strcat(rawFilename, ".img");


	//读入裸数据

	if (! (fp = fopen(rawFilename, "rb"))) 
	{
		perror("opening .img file failed");
		exit(1);
	}

	size = sizes[0] * sizes[1] * sizes[2];
	if (! (*data = malloc(size * dataTypeSize))) 
	{
		fprintf(stderr, "not enough memory for volume data\n");
		exit(1);
	}

	if (fread(*data, dataTypeSize, size, fp) != size) 
	{
		fprintf(stderr, "reading volume data failed");
		exit(1);
	}

	fclose(fp);	
}
2.根据窗宽、窗位映射表

void GetLut(uchar*& pLut, double wl, double ww)
{
	// 计算最大最小值
	minValue = USHRT_MAX;
	maxValue = 0;
	ushort* ptr = (ushort*)data;
	for(uint i=0; i<sizes[0]*sizes[1]*sizes[2]; i++){
		if (ptr[i] > maxValue) maxValue = ptr[i]; 
		if (ptr[i] < minValue) minValue = ptr[i];
	}
	std::cout << "min,max value: " << minValue << ", " << maxValue << std::endl;


	//当wl和ww为0时,由图像数据自动计算合适的窗宽窗位
	if(wl==0 && ww==0){
		wl = minValue + (maxValue-minValue)/2.0f;
		ww = maxValue - minValue;
	}

	//uint lutSize = maxValue-minValue+1;
	uint lutSize = maxValue;
	pLut = new uchar[lutSize];
	double dColor1 = 0;
	double dColor2 = 255;

	double dValue1 = wl - ww/2.0f;
	double dValue2 = dValue1 + ww;

	double dK = (dColor2-dColor1+1)/ww;

	//dValue1 -= minValue;
	//dValue2 -= minValue;

	for(int i=0; i<l
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值