我想要深度复制 cv::dnn::Net 的实例:
cv::dnn::Net n1 = cv::dnn::readNetFromONNX("");
cv::dnn::Net n2 = n1;
但是据我了解,这个类使用了隐式共享。在文档中我没有找到任何方法来实现完全复制实例的功能(例如一些copy()方法)。您知道是否有可能实现这个功能吗?
为了回答您的问题,我参考了OpenCV文档(关于dnn模块)和源代码。
cv::dnn::Net没有显式定义的复制或移动构造函数(和复制运算符)。该类只是接口,唯一的数据成员是指向其私有部分实现的指针。
class CV_EXPORTS_W_SIMPLE Net
{
public:
CV_WRAP Net(); //!< Default constructor.
CV_WRAP ~Net(); //!< Destructor frees the net only if there aren't references to the net anymore.
...
private:
struct Impl;
Ptr<Impl> impl;
};
cv::dnn::Net n2 = n1;
的时候没有必要复制它,因为这只是创建了另一个指向同一实现的指针。而且如果没有任何接口来访问私有指针的实现,你几乎无法在不修改源代码的情况下访问它。cv::dnn::Net
并允许设置输入参数的 cv::dnn::Model
,因为它也只是一个指向实现的指针。cv::dnn::Net::forwardAsync()
,但这只适用于intel推理引擎后端。尝试从并发线程调用cv::dnn::Net::forward()
将导致运行时错误。forwardAsync()
可能会提供更好的性能)。
readNetFromONNX
。你有深拷贝的用例吗? - Yashas