int main() { SR_net* net = SR_net::createSRNet(); vector<String> files; glob("E:/prj/超分样本/1", files, true); size_t num = files.size(); bool Moos = true; cout << "共读取了" << num << "张图片" << endl; cout << "--------------------------------" << endl; for (int i = 0; i < num; i++) { Mat srcimg = imread(files[i]); Mat SR_image = net.Detect(srcimg, Moos); imshow("input", srcimg); imshow("result", SR_image); imwrite("./output/" + to_string(i + 1) + ".png", SR_image); } } 这段代码中Mat SR_image = net.Detect(srcimg, Moos);报错应该怎么改
时间: 2024-01-28 22:05:50 浏览: 108
根据代码,`net` 是一个指向 `SR_net` 类的指针,而不是一个对象。因此,你需要使用箭头运算符 `->` 而不是点运算符 `.` 来调用 `Detect` 函数。修改代码如下:
```
Mat SR_image = net->Detect(srcimg, Moos);
```
这样就能正确调用 `Detect` 函数了。
相关问题
class SR_net { public: SR_net(string path, vector<int> input_size, bool fp32, bool cuda = true); private: vector<int64_t> Gdims; int Gfp32; Env env = Env(ORT_LOGGING_LEVEL_ERROR, "RRDB"); SessionOptions session_options = SessionOptions(); Session* Gsession = nullptr; vector<const char*> Ginput_names; vector<const char*> Goutput_names; vector<int> Ginput_size = {}; }; SR_net::SR_net(string path, vector<int> input_size, bool fp32, bool cuda) { this->Ginput_size = input_size; this->Gfp32 = fp32; clock_t startTime_, endTime_; startTime_ = clock(); session_options.SetIntraOpNumThreads(6); if (cuda) { OrtCUDAProviderOptions cuda_option; cuda_option.device_id = 0; cuda_option.arena_extend_strategy = 0; cuda_option.cudnn_conv_algo_search = OrtCudnnConvAlgoSearchExhaustive; cuda_option.gpu_mem_limit = SIZE_MAX; cuda_option.do_copy_in_default_stream = 1; session_options.AppendExecutionProvider_CUDA(cuda_option); } wstring widestr = wstring(path.begin(), path.end()); this->Gsession = new Session(env, widestr.c_str(), this->session_options); this->session_options.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_ENABLE_ALL); AllocatorWithDefaultOptions allocator; this->Ginput_names = { "input" }; this->Goutput_names = { "output" }; endTime_ = clock(); cout << " The model loading time is:" << (double)(endTime_ - startTime_) / CLOCKS_PER_SEC << "s" << endl; } int main() { vector<int> input_shape = {}; SR_net net("E:/prj/SR_C/onnx_file/rrdb_full.onnx", input_shape, true, true); vector<String> files; glob("E:/prj/超分样本/1", files, true); size_t num = files.size(); bool Moos = true; cout << "共读取了" << num << "张图片" << endl; cout << "--------------------------------" << endl; for (int i = 0; i < num; i++) { Mat srcimg = imread(files[i]); Mat SR_image = net.Detect(srcimg, Moos); imshow("input", srcimg); imshow("result", SR_image); imwrite("./output/" + to_string(i + 1) + ".png", SR_image); waitKey(0); } },在这段代码中,我如何把SR_net net("E:/prj/SR_C/onnx_file/rrdb_full.onnx", input_shape, true, true);这一行写到主函数的外面?
可以在 SR_net 类的定义中增加一个默认构造函数,并在这个构造函数中调用 SR_net(string path, vector<int> input_size, bool fp32, bool cuda) 构造函数,如下所示:
```c++
class SR_net {
public:
SR_net() : SR_net("E:/prj/SR_C/onnx_file/rrdb_full.onnx", {}, true, true) {}
SR_net(string path, vector<int> input_size, bool fp32, bool cuda = true);
// 其他成员函数和成员变量
};
int main() {
SR_net net;
// 其他代码
return 0;
}
```
这样,在主函数中就可以直接使用 SR_net net; 创建对象了。默认构造函数中的参数可以根据实际情况进行修改。
解释下<RollingFile name="ApiLog" fileName="${sys:API_LOG_PATH}/api_log.log" filePattern="${sys:API_LOG_PATH}/%d{yyyy-MM-dd}/api_log-%d{yyyy-MM-dd}-%i.log" fileAppend="true" immediateFlush="true"> <PatternLayout pattern="${sys:FILE_LOG_PATTERN}" charset="${sys:LOG_CHARSET}"/> <Policies> <TimeBasedTriggeringPolicy/> <SizeBasedTriggeringPolicy size="20 MB"/> </Policies> <DefaultRolloverStrategy max="100" > <Delete basePath="${sys:API_LOG_PATH}" maxDepth="2"> <IfFileName glob="%d{yyyy-MM-dd}/api_log-*.log"> <IfAny> <IfLastModified age="15d" /> <IfAccumulatedFileSize exceeds="100 MB"/> <IfAccumulatedFileCount exceeds="10"/> </IfAny> </IfFileName> </Delete> </DefaultRolloverStrategy> </RollingFile>
这段代码是一个log4j2的配置,用于生成和管理API日志文件,具体解释如下:
1. `name="ApiLog"`:定义日志文件的名称为ApiLog。
2. `fileName="${sys:API_LOG_PATH}/api_log.log"`:定义日志文件的路径和名称。其中 `${sys:API_LOG_PATH}` 是一个系统变量,表示日志文件的存储路径,`api_log.log` 是日志文件的名称。
3. `filePattern="${sys:API_LOG_PATH}/%d{yyyy-MM-dd}/api_log-%d{yyyy-MM-dd}-%i.log"`:定义日志文件的滚动策略。其中 `%d{yyyy-MM-dd}` 表示按照年月日的格式来创建子目录,`api_log-%d{yyyy-MM-dd}-%i.log` 表示按照年月日和文件序号来命名日志文件。
4. `fileAppend="true"`:表示日志文件在追加模式下写入,即不会覆盖之前的日志内容。
5. `immediateFlush="true"`:表示日志内容立即写入文件。
6. `<PatternLayout pattern="${sys:FILE_LOG_PATTERN}" charset="${sys:LOG_CHARSET}"/>`:定义日志内容的格式和字符集。
7. `<Policies>`:定义日志文件的滚动策略,包括时间和文件大小两种策略。
8. `<TimeBasedTriggeringPolicy/>`:按照时间来触发日志文件的滚动。
9. `<SizeBasedTriggeringPolicy size="20 MB"/>`:按照文件大小来触发日志文件的滚动,当文件大小达到20MB时,会触发滚动。
10. `<DefaultRolloverStrategy max="100" >`:定义日志文件的滚动策略,包括最大文件数和删除策略。
11. `<Delete basePath="${sys:API_LOG_PATH}" maxDepth="2">`:定义日志文件的删除策略,包括删除的目录和文件数的限制。
12. `<IfFileName glob="%d{yyyy-MM-dd}/api_log-*.log">`:定义删除的文件名的匹配规则。
13. `<IfAny>`:定义删除的文件的条件,包括文件的最后修改时间、累计文件大小和累计文件数。
综上所述,这段代码的作用是按照时间和文件大小来管理API日志文件,保留最近的100个日志文件,并根据一定的条件删除较早的日志文件。
阅读全文