c++ tensorrt 推理过程(图片超分)

//1:创建.logger
class Logger:public  ILogger
{
	void log(Severity severity,const char* msg) override
	{
		if(severity != Severity::kINFO)
			srd::cout<<msg<<std::endl;	
	}
}gLogger;

//反序列化
string engine_path="xxxxx.engine";
ifstream fin(engine_path);
string sensen_engine="";   //将engine数据写入string;
while(fin.peek()!=EOF)
{
	stringstream buff;
	buff << fin.rdbuf();
	sensen_engine.append(buffer.str());
}
fin.close();

//创建runtime
IRuntime* runtime=createrInferRuntime(gLogger);

//根据写入string的数据创建engine
ICudaEngine* engine = runtime->deserializeCudaEngine(sensen_engine.data(),sensen_endgine.size(),nullptr);

//创建context
IExecutionContext* context = engine->createExecutionContext();

//图片处理
string img_path = "xxx.png";
Mat img = imread(img_path);
int h=img.rows;//获取图片的长
int w=img.cols;//获取图片的宽
cvtColor(img,img,COLOR_BGR2YCrCb);//将图片转换为YCrCb
voctor<Mat> over;
split(img,over);
over[0].convertTo(over[0],CV_32F,1/255.0) //将Y通道归一化

//创建buffers 指向输入输出流
void *buffers[2];
int inputIndex;
int outputIndex;
for(int bi = 0;bi < engine->getNbBindings();bi++)
{
	if(engine->bindingIsInput(bi)==true)
		inputIndex=bi;
	else
		outputIndex=bi;
}

// 分配buffers空间
cudaMalloc(&buffers[inputIndex],h*w*sizeof(float ));
cudaMalloc(&buffers[outputIndex],h*2*w*2*sizeof(float ));//超分后的大小

//创建cuda流
cudaStream_t stram;
cudaStreamCreate(&stream);

//复制图片数据到GPU
cudaMemcpyAsync(buffers[inputIndex],over[0],h*w*sizeof(float),cudaMemcpyHostToDevice,stream);

//执行推理
context->enqueue(1,buffers,stream,nullptr);

//将3个通道都转为超分后的大小
for(int i=0;i<3;i++)
	resize(over[i],over[i],Size(w*2,h*2),0,0,INTER_CUBIC);

//将GPU数据拷贝回CPU
	cudaMemcpy(over[0],buffers[outputIndex],h*2*w*2*sizeof(float),cudaMemcpyDeviceToHost,stream);
	
//反归一化,转换数据类型
over[0],convertTo(over[0],CV_8U,1*255);
//合并3通道,写入文件
Mat png;
merge(over,png);
//将YCrCb转回RGB(opencv中是BGR),写入文件;
cvtColor(png,png,COLOR_YCrCb2BGR);
imwrite("xxxx.png",png);

//释放资源
 cudaStreamDestroy(stream);
    context->destroy();
    engine->destroy();
    runtime->destroy();
    cudaFree(buffers[inputIndex]);
    cudaFree(buffers[outputIndex]);
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值