diff --git a/include/aidge/backend/opencv/data/TensorImpl.hpp b/include/aidge/backend/opencv/data/TensorImpl.hpp index 50a0531a0d4f197b4d2c543ac42bca7ed9757391..1cd9fc812173451bec496f8cb9986b1ce5c0ea21 100644 --- a/include/aidge/backend/opencv/data/TensorImpl.hpp +++ b/include/aidge/backend/opencv/data/TensorImpl.hpp @@ -37,15 +37,19 @@ private: const Tensor &mTensor; // Impl needs to access Tensor information, but is not // supposed to change it! - cv::Mat mData; - - std::unique_ptr<cv::Mat> mDataOwner = std::unique_ptr<cv::Mat>(new cv::Mat(0,0,OpenCvType<T>::type)); + cv::Mat* mData; + std::unique_ptr<cv::Mat> mDataOwner; public: static constexpr const char *Backend = "opencv"; + TensorImpl_opencv() = delete; TensorImpl_opencv(const Tensor &tensor) - : TensorImpl(Backend), mTensor(tensor) {} + : TensorImpl(Backend), mTensor(tensor) + { + mDataOwner = std::unique_ptr<cv::Mat>(new cv::Mat(0,0,OpenCvType<T>::type)); + mData = mDataOwner.get(); + } bool operator==(const TensorImpl &otherImpl) const override final { // Create iterators for both matrices @@ -69,11 +73,11 @@ public: } // native interface - const cv::Mat data() const { return mData; } + const cv::Mat data() const { return *mData; } std::size_t scalarSize() const override { return sizeof(T); } - std::size_t size() const override { return mData.total() * mData.channels(); } + std::size_t size() const override { return mData->total() * mData->channels();} void setDevice(DeviceIdx_t device) override { AIDGE_ASSERT(device == 0, "device cannot be != 0 for Opencv backend"); @@ -160,29 +164,29 @@ public: void *rawPtr(NbElts_t offset = 0) override { lazyInit(); - return (mData.ptr<T>() + offset); + return (mData->ptr<T>() + offset); }; const void *rawPtr(NbElts_t offset = 0) const override { AIDGE_ASSERT(size() >= mTensor.size(), "accessing uninitialized const rawPtr"); - return (mData.ptr<T>() + offset); + return (mData->ptr<T>() + offset); }; void *hostPtr(NbElts_t offset = 0) override { lazyInit(); - return (mData.ptr<T>() + offset); + return (mData->ptr<T>() + offset); }; const void *hostPtr(NbElts_t offset = 0) const override { AIDGE_ASSERT(size() >= mTensor.size(), "accessing uninitialized const hostPtr"); - AIDGE_ASSERT(mData.isContinuous(), "CV Matrix not continuous"); - return (mData.ptr<T>() + offset); + AIDGE_ASSERT(mData->isContinuous(), "CV Matrix not continuous"); + return (mData->ptr<T>() + offset); }; const cv::Mat& getCvMat() const override { return *mDataOwner.get(); } void setCvMat(const cv::Mat& mat) override { mDataOwner.reset(new cv::Mat(std::move(mat))); - mData = *mDataOwner.get();} + mData = mDataOwner.get();} virtual ~TensorImpl_opencv() = default; @@ -192,7 +196,7 @@ private: void lazyInit() { if (size() < mTensor.size()) { // Need more data, a re-allocation will occur - AIDGE_ASSERT(mData.empty() || mDataOwner != nullptr, "trying to enlarge non-owned data"); + AIDGE_ASSERT(mData->empty() || mDataOwner != nullptr, "trying to enlarge non-owned data"); cv::Mat myNewMatrix; if (mTensor.nbDims() < 3) { @@ -214,7 +218,7 @@ private: } mDataOwner.reset(new cv::Mat(std::forward<cv::Mat>(myNewMatrix))); - mData = *mDataOwner.get(); + mData = mDataOwner.get(); } } diff --git a/include/aidge/backend/opencv/utils/Utils.hpp b/include/aidge/backend/opencv/utils/Utils.hpp index 6d84c909e2e3ee964132f0c939c0bdf75cb1e137..a6840c4a63595723ebd289eb714d707e6a53a7bb 100644 --- a/include/aidge/backend/opencv/utils/Utils.hpp +++ b/include/aidge/backend/opencv/utils/Utils.hpp @@ -36,37 +36,39 @@ namespace Aidge { std::vector<DimSize_t> matDims = std::vector<DimSize_t>({static_cast<DimSize_t>(mat.cols), static_cast<DimSize_t>(mat.rows), static_cast<DimSize_t>(mat.channels())}); - // Create tensor from the dims of the Cv::Mat - std::shared_ptr<Tensor> tensor = std::make_shared<Tensor>(matDims); - // Set beackend opencv - tensor->setBackend("opencv"); - // Set Data Type + Aidge::DataType type; switch (mat.depth()) { case CV_8U: - tensor->setDataType(Aidge::DataType::UInt8); + type = Aidge::DataType::UInt8; break; case CV_8S: - tensor->setDataType(Aidge::DataType::Int8); + type = Aidge::DataType::Int8; break; case CV_16U: - tensor->setDataType(Aidge::DataType::UInt16); + type = Aidge::DataType::UInt16; break; case CV_16S: - tensor->setDataType(Aidge::DataType::Int16); + type = Aidge::DataType::Int16; break; case CV_32S: - tensor->setDataType(Aidge::DataType::Int32); + type = Aidge::DataType::Int32; break; case CV_32F: - tensor->setDataType(Aidge::DataType::Float32); + type = Aidge::DataType::Float32; break; case CV_64F: - tensor->setDataType(Aidge::DataType::Float64); + type = Aidge::DataType::Float64; break; default: throw std::runtime_error( "Cannot convert cv::Mat to Tensor: incompatible types."); } + + // Create tensor from the dims of the Cv::Mat + std::shared_ptr<Tensor> tensor = std::make_shared<Tensor>(matDims,type); + + // Set beackend opencv + tensor->setBackend("opencv"); // Cast the tensorImpl to access setCvMat function TensorImpl_opencv_* tImpl_opencv = dynamic_cast<TensorImpl_opencv_*>(tensor->getImpl().get());