utils.cc 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. // Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. #include "ultra_infer/utils/utils.h"
  15. #include "ultra_infer/vision/common/processors/utils.h"
  16. namespace ultra_infer {
  17. namespace vision {
  18. FDDataType OpenCVDataTypeToFD(int type) {
  19. type = type % 8;
  20. if (type == 0) {
  21. return FDDataType::UINT8;
  22. } else if (type == 1) {
  23. return FDDataType::INT8;
  24. } else if (type == 2) {
  25. FDASSERT(false,
  26. "While calling OpenCVDataTypeToFD(), get UINT16 type which is not "
  27. "supported now.");
  28. } else if (type == 3) {
  29. return FDDataType::INT16;
  30. } else if (type == 4) {
  31. return FDDataType::INT32;
  32. } else if (type == 5) {
  33. return FDDataType::FP32;
  34. } else if (type == 6) {
  35. return FDDataType::FP64;
  36. } else {
  37. FDASSERT(false,
  38. "While calling OpenCVDataTypeToFD(), get type = %d, which is not "
  39. "expected.",
  40. type);
  41. }
  42. }
  43. int CreateOpenCVDataType(FDDataType type, int channel) {
  44. FDASSERT(channel == 1 || channel == 3 || channel == 4,
  45. "Only support channel be 1/3/4 in OpenCV.");
  46. if (type == FDDataType::UINT8) {
  47. if (channel == 1) {
  48. return CV_8UC1;
  49. } else if (channel == 3) {
  50. return CV_8UC3;
  51. } else {
  52. return CV_8UC4;
  53. }
  54. } else if (type == FDDataType::FP32) {
  55. if (channel == 1) {
  56. return CV_32FC1;
  57. } else if (channel == 3) {
  58. return CV_32FC3;
  59. } else {
  60. return CV_32FC4;
  61. }
  62. }
  63. FDASSERT(false, "Data type of %s is not supported.", Str(type).c_str());
  64. return CV_32FC3;
  65. }
  66. #ifdef ENABLE_FLYCV
  67. FDDataType FlyCVDataTypeToFD(fcv::FCVImageType type) {
  68. if (type == fcv::FCVImageType::GRAY_U8) {
  69. return FDDataType::UINT8;
  70. } else if (type == fcv::FCVImageType::PKG_BGR_U8) {
  71. return FDDataType::UINT8;
  72. } else if (type == fcv::FCVImageType::PKG_RGB_U8) {
  73. return FDDataType::UINT8;
  74. } else if (type == fcv::FCVImageType::PKG_BGR_U8) {
  75. return FDDataType::UINT8;
  76. } else if (type == fcv::FCVImageType::PKG_RGB_U8) {
  77. return FDDataType::UINT8;
  78. } else if (type == fcv::FCVImageType::PLA_BGR_U8) {
  79. return FDDataType::UINT8;
  80. } else if (type == fcv::FCVImageType::PLA_RGB_U8) {
  81. return FDDataType::UINT8;
  82. } else if (type == fcv::FCVImageType::PLA_BGRA_U8) {
  83. return FDDataType::UINT8;
  84. } else if (type == fcv::FCVImageType::PLA_RGBA_U8) {
  85. return FDDataType::UINT8;
  86. } else if (type == fcv::FCVImageType::PLA_BGR_F32) {
  87. return FDDataType::FP32;
  88. } else if (type == fcv::FCVImageType::PLA_RGB_F32) {
  89. return FDDataType::FP32;
  90. } else if (type == fcv::FCVImageType::PLA_BGRA_F32) {
  91. return FDDataType::FP32;
  92. } else if (type == fcv::FCVImageType::PLA_RGBA_F32) {
  93. return FDDataType::FP32;
  94. } else if (type == fcv::FCVImageType::PKG_BGRA_U8) {
  95. return FDDataType::UINT8;
  96. } else if (type == fcv::FCVImageType::PKG_RGBA_U8) {
  97. return FDDataType::UINT8;
  98. } else if (type == fcv::FCVImageType::PKG_BGRA_U8) {
  99. return FDDataType::UINT8;
  100. } else if (type == fcv::FCVImageType::PKG_RGBA_U8) {
  101. return FDDataType::UINT8;
  102. } else if (type == fcv::FCVImageType::PKG_BGR565_U8) {
  103. return FDDataType::UINT8;
  104. } else if (type == fcv::FCVImageType::PKG_RGB565_U8) {
  105. return FDDataType::UINT8;
  106. } else if (type == fcv::FCVImageType::GRAY_S32) {
  107. return FDDataType::INT32;
  108. } else if (type == fcv::FCVImageType::GRAY_F32) {
  109. return FDDataType::FP32;
  110. } else if (type == fcv::FCVImageType::PKG_BGR_F32) {
  111. return FDDataType::FP32;
  112. } else if (type == fcv::FCVImageType::PKG_RGB_F32) {
  113. return FDDataType::FP32;
  114. } else if (type == fcv::FCVImageType::PKG_BGR_F32) {
  115. return FDDataType::FP32;
  116. } else if (type == fcv::FCVImageType::PKG_RGB_F32) {
  117. return FDDataType::FP32;
  118. } else if (type == fcv::FCVImageType::PKG_BGRA_F32) {
  119. return FDDataType::FP32;
  120. } else if (type == fcv::FCVImageType::PKG_RGBA_F32) {
  121. return FDDataType::FP32;
  122. } else if (type == fcv::FCVImageType::PKG_BGRA_F32) {
  123. return FDDataType::FP32;
  124. } else if (type == fcv::FCVImageType::PKG_RGBA_F32) {
  125. return FDDataType::FP32;
  126. } else if (type == fcv::FCVImageType::GRAY_F64) {
  127. return FDDataType::FP64;
  128. }
  129. FDASSERT(false, "While calling FlyCVDataTypeToFD(), get unexpected type:%d.",
  130. int(type));
  131. return FDDataType::UNKNOWN1;
  132. }
  133. fcv::FCVImageType CreateFlyCVDataType(FDDataType type, int channel) {
  134. FDASSERT(channel == 1 || channel == 3 || channel == 4,
  135. "Only support channel be 1/3/4 in FlyCV.");
  136. if (type == FDDataType::UINT8) {
  137. if (channel == 1) {
  138. return fcv::FCVImageType::GRAY_U8;
  139. } else if (channel == 3) {
  140. return fcv::FCVImageType::PKG_BGR_U8;
  141. } else {
  142. return fcv::FCVImageType::PKG_BGRA_U8;
  143. }
  144. } else if (type == FDDataType::FP32) {
  145. if (channel == 1) {
  146. return fcv::FCVImageType::GRAY_F32;
  147. } else if (channel == 3) {
  148. return fcv::FCVImageType::PKG_BGR_F32;
  149. } else {
  150. return fcv::FCVImageType::PKG_BGRA_F32;
  151. }
  152. }
  153. FDASSERT(false, "Data type of %s is not supported.", Str(type).c_str());
  154. return fcv::FCVImageType::PKG_BGR_F32;
  155. }
  156. fcv::Mat ConvertOpenCVMatToFlyCV(cv::Mat &im) {
  157. int type = im.type() % 8;
  158. // 0: uint8; 5: float32; 6: float64
  159. if (type != 0 && type != 5 && type != 6) {
  160. FDASSERT(false, "Only support type of uint8/float/double, but now it's %d.",
  161. im.type());
  162. }
  163. auto fcv_type =
  164. CreateFlyCVDataType(OpenCVDataTypeToFD(im.type()), im.channels());
  165. return fcv::Mat(im.cols, im.rows, fcv_type, im.ptr()); // reference only
  166. }
  167. cv::Mat ConvertFlyCVMatToOpenCV(fcv::Mat &fim) {
  168. auto fd_dtype = FlyCVDataTypeToFD(fim.type());
  169. if (fd_dtype != FDDataType::UINT8 && fd_dtype != FDDataType::FP32 &&
  170. fd_dtype != FDDataType::FP64) {
  171. FDASSERT(false, "Only support type of uint8/float/double, but now it's %s.",
  172. Str(fd_dtype).c_str());
  173. }
  174. auto ocv_type = CreateOpenCVDataType(fd_dtype, fim.channels());
  175. return cv::Mat(fim.height(), fim.width(), ocv_type,
  176. fim.data()); // reference only
  177. }
  178. #endif
  179. cv::Mat CreateZeroCopyOpenCVMatFromBuffer(int height, int width, int channels,
  180. FDDataType type, void *data) {
  181. cv::Mat ocv_mat;
  182. switch (type) {
  183. case FDDataType::UINT8:
  184. ocv_mat = cv::Mat(height, width, CV_8UC(channels), data);
  185. break;
  186. case FDDataType::INT8:
  187. ocv_mat = cv::Mat(height, width, CV_8SC(channels), data);
  188. break;
  189. case FDDataType::INT16:
  190. ocv_mat = cv::Mat(height, width, CV_16SC(channels), data);
  191. break;
  192. case FDDataType::INT32:
  193. ocv_mat = cv::Mat(height, width, CV_32SC(channels), data);
  194. break;
  195. case FDDataType::FP32:
  196. ocv_mat = cv::Mat(height, width, CV_32FC(channels), data);
  197. break;
  198. case FDDataType::FP64:
  199. ocv_mat = cv::Mat(height, width, CV_64FC(channels), data);
  200. break;
  201. default:
  202. FDASSERT(false,
  203. "Tensor type %d is not supported While calling "
  204. "CreateZeroCopyOpenCVMat.",
  205. type);
  206. break;
  207. }
  208. return ocv_mat;
  209. }
  210. cv::Mat CreateZeroCopyOpenCVMatFromTensor(const FDTensor &tensor,
  211. Layout layout) {
  212. FDASSERT(tensor.shape.size() == 3, "When create OepnCV Mat from tensor,"
  213. "tensor shape should be 3-Dim");
  214. FDDataType type = tensor.dtype;
  215. int height = static_cast<int>(tensor.shape[0]);
  216. int width = static_cast<int>(tensor.shape[1]);
  217. int channels = static_cast<int>(tensor.shape[2]);
  218. if (layout == Layout::CHW) {
  219. channels = static_cast<int>(tensor.shape[0]);
  220. height = static_cast<int>(tensor.shape[1]);
  221. width = static_cast<int>(tensor.shape[2]);
  222. }
  223. return CreateZeroCopyOpenCVMatFromBuffer(
  224. height, width, channels, type, const_cast<void *>(tensor.CpuData()));
  225. }
  226. #ifdef ENABLE_FLYCV
  227. fcv::Mat CreateZeroCopyFlyCVMatFromBuffer(int height, int width, int channels,
  228. FDDataType type, void *data) {
  229. fcv::Mat fcv_mat;
  230. auto fcv_type = CreateFlyCVDataType(type, channels);
  231. switch (type) {
  232. case FDDataType::UINT8:
  233. fcv_mat = fcv::Mat(width, height, fcv_type, data);
  234. break;
  235. case FDDataType::FP32:
  236. fcv_mat = fcv::Mat(width, height, fcv_type, data);
  237. break;
  238. case FDDataType::FP64:
  239. fcv_mat = fcv::Mat(width, height, fcv_type, data);
  240. break;
  241. default:
  242. FDASSERT(false,
  243. "Tensor type %d is not supported While calling "
  244. "CreateZeroCopyFlyCVMat.",
  245. type);
  246. break;
  247. }
  248. return fcv_mat;
  249. }
  250. fcv::Mat CreateZeroCopyFlyCVMatFromTensor(const FDTensor &tensor) {
  251. // TODO(qiuyanjun): Should add a Layout checking. Now, we
  252. // assume that the input tensor is already in Layout::HWC.
  253. FDASSERT(tensor.shape.size() == 3,
  254. "When create FlyCV Mat from tensor,"
  255. "tensor shape should be 3-Dim, HWC layout");
  256. FDDataType type = tensor.dtype;
  257. int height = static_cast<int>(tensor.shape[0]);
  258. int width = static_cast<int>(tensor.shape[1]);
  259. int channels = static_cast<int>(tensor.shape[2]);
  260. return CreateZeroCopyFlyCVMatFromBuffer(height, width, channels, type,
  261. const_cast<void *>(tensor.Data()));
  262. }
  263. #endif
  264. } // namespace vision
  265. } // namespace ultra_infer