opencv mat 修改_C++ opencv矩阵和pytorch tensor的互相转换
生活随笔
收集整理的這篇文章主要介紹了
opencv mat 修改_C++ opencv矩阵和pytorch tensor的互相转换
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
矩陣和tensor相互轉換
cvmat到tensor
tips:這里主要要注意的就是在opencv和pytorch中存儲順序的差異
cv::cvtColor(frame, frame, CV_BGR2RGB);//normalizationframe.convertTo(frame, CV_32FC3, 1.0f / 255.0f);//opencv format H*W*Cauto input_tensor = torch::from_blob(frame.data, {1, frame_h, frame_w, kCHANNELS});//pytorch format N*C*H*Winput_tensor = input_tensor.permute({0, 3, 1, 2});tensor 到cvmat
tips:1.squeeze只用于batchsize為1的場景2.permute 是將存儲格式從pytorch形式轉成opencv格式3.因為在處理前對cvmat中的值做了歸一化,所以現在要*255恢復,同時對于不在0-255范圍內的數據,需要做限制4.因為cvmat的數據格式是8UC3,所以torch tensor要提前轉換成kU8
//send tensor to cpu input_tensor = input_tensor.to(at::kCUDA); //inference torch::Tensor out_tensor = module->forward({input_tensor}).toTensor(); //sequeeze trans tensor shape from 1*C*H*W to C*H*W //permute C*H*W to H*W*C out_tensor = out_tensor.squeeze().detach().permute({1, 2, 0}); //see tip3,tip4 out_tensor = out_tensor.mul(255).clamp(0, 255).to(torch::kU8); out_tensor = out_tensor.to(torch::kCPU); cv::Mat resultImg(frame_h, frame_w, CV_8UC1); //copy the data from out_tensor to resultImg std::memcpy((void *) resultImg.data, out_tensor.data_ptr(), sizeof(torch::kU8) * out_tensor.numel());如有錯誤,感謝指正!
2020/01/14更新
1.tensor 到 cv::Mat 修改一處錯誤
memcpy 復制過程,resultImg對應的數據結構應該為CV_8UC1。
2.對于非uint類型的數據類型轉換,例如float、double,需做以下兩點修改:
1)resultImg需修改成其他opencv的數據結構
2)std::memcpy 行中sizeof()中內容,需要修改成c++中內建的數據類型,如果使用torch::kF32或者其他浮點型,會出現數據復制缺失的情況。
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的opencv mat 修改_C++ opencv矩阵和pytorch tensor的互相转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 路由器如何查看是否有wifi如何通过路由
- 下一篇: 如何在保留个人文件的前提下重置系统重置电