main (copy).cpp 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. #include <iostream>
  2. #include<opencv2/opencv.hpp>
  3. #include<math.h>
  4. #include "yolov8.h"
  5. #include "yolov8_onnx.h"
  6. #include "yolov8_seg.h"
  7. #include "rtdetr_onnx.h"
  8. #include "yolov8_seg_onnx.h"
  9. #include "yolov8_obb.h"
  10. #include "yolov8_obb_onnx.h"
  11. #include "yolov8_pose.h"
  12. #include "yolov8_pose_onnx.h"
  13. #include<time.h>
  14. //#define VIDEO_OPENCV //if define, use opencv for video.
  15. using namespace std;
  16. using namespace cv;
  17. using namespace dnn;
  18. template<typename _Tp>
  19. int yolov8(_Tp& task, cv::Mat& img, std::string& model_path)
  20. {
  21. cv::dnn::Net net;
  22. if (task.ReadModel(net, model_path, false)) {
  23. std::cout << "read net ok!" << std::endl;
  24. }
  25. else {
  26. return -1;
  27. }
  28. //生成随机颜色
  29. std::vector<cv::Scalar> color;
  30. srand(time(0));
  31. for (int i = 0; i < 80; i++) {
  32. int b = rand() % 256;
  33. int g = rand() % 256;
  34. int r = rand() % 256;
  35. color.push_back(cv::Scalar(b, g, r));
  36. }
  37. std::vector<OutputParams> result;
  38. bool isPose = false;
  39. if (typeid(task) == typeid(Yolov8Pose)) {
  40. isPose = true;
  41. }
  42. PoseParams poseParams;
  43. if (task.Detect(img, net, result)) {
  44. if (isPose)
  45. DrawPredPose(img, result, poseParams);
  46. else
  47. DrawPred(img, result, task._className, color);
  48. }
  49. else {
  50. std::cout << "Detect Failed!" << std::endl;
  51. }
  52. system("pause");
  53. return 0;
  54. }
  55. template<typename _Tp>
  56. int yolov8_onnx(_Tp& task, cv::Mat& img, std::string& model_path)
  57. {
  58. if (task.ReadModel(model_path, false)) {
  59. std::cout << "read net ok!" << std::endl;
  60. }
  61. else {
  62. return -1;
  63. }
  64. //生成随机颜色
  65. std::vector<cv::Scalar> color;
  66. srand(time(0));
  67. for (int i = 0; i < 80; i++) {
  68. int b = rand() % 256;
  69. int g = rand() % 256;
  70. int r = rand() % 256;
  71. color.push_back(cv::Scalar(b, g, r));
  72. }
  73. bool isPose = false;
  74. if (typeid(task) == typeid(Yolov8PoseOnnx)) {
  75. isPose = true;
  76. }
  77. PoseParams poseParams;
  78. std::vector<OutputParams> result;
  79. if (task.OnnxDetect(img, result)) {
  80. if (isPose)
  81. DrawPredPose(img, result, poseParams);
  82. else
  83. DrawPred(img, result, task._className, color);
  84. }
  85. else {
  86. std::cout << "Detect Failed!" << std::endl;
  87. }
  88. system("pause");
  89. return 0;
  90. }
  91. template<typename _Tp>
  92. int video_demo(_Tp& task, std::string& model_path)
  93. {
  94. std::vector<cv::Scalar> color;
  95. srand(time(0));
  96. for (int i = 0; i < 80; i++) {
  97. int b = rand() % 256;
  98. int g = rand() % 256;
  99. int r = rand() % 256;
  100. color.push_back(cv::Scalar(b, g, r));
  101. }
  102. std::vector<OutputParams> result;
  103. cv::VideoCapture cap(0);
  104. if (!cap.isOpened())
  105. {
  106. std::cout << "open capture failured!" << std::endl;
  107. return -1;
  108. }
  109. cv::Mat frame;
  110. bool isPose = false;
  111. PoseParams poseParams;
  112. #ifdef VIDEO_OPENCV
  113. cv::dnn::Net net;
  114. if (typeid(task) == typeid(Yolov8Pose)) {
  115. isPose = true;
  116. }
  117. if (task.ReadModel(net, model_path, true)) {
  118. std::cout << "read net ok!" << std::endl;
  119. }
  120. else {
  121. std::cout << "read net failured!" << std::endl;
  122. return -1;
  123. }
  124. #else
  125. if (typeid(task) == typeid(Yolov8PoseOnnx)) {
  126. isPose = true;
  127. }
  128. if (task.ReadModel(model_path, true)) {
  129. std::cout << "read net ok!" << std::endl;
  130. }
  131. else {
  132. std::cout << "read net failured!" << std::endl;
  133. return -1;
  134. }
  135. #endif
  136. while (true)
  137. {
  138. cap.read(frame);
  139. if (frame.empty())
  140. {
  141. std::cout << "read to end" << std::endl;
  142. break;
  143. }
  144. result.clear();
  145. #ifdef VIDEO_OPENCV
  146. if (task.Detect(frame, net, result)) {
  147. if (isPose)
  148. DrawPredPose(frame, result, poseParams,true);
  149. else
  150. DrawPred(frame, result, task._className, color,true);
  151. }
  152. #else
  153. if (task.OnnxDetect(frame, result)) {
  154. if (isPose)
  155. DrawPredPose(frame, result, poseParams, true);
  156. else
  157. DrawPred(frame, result, task._className, color, true);
  158. }
  159. #endif
  160. int k = waitKey(10);
  161. if (k == 27) { //esc
  162. break;
  163. }
  164. }
  165. cap.release();
  166. system("pause");
  167. return 0;
  168. }
  169. int main() {
  170. std::string img_path = "./images/bus.jpg";
  171. std::string model_path_detect = "./models/yolov8s-pose1.onnx";
  172. std::string model_path_rtdetr = "./models/rtdetr-l.onnx"; //yolov8-redetr
  173. std::string model_path_obb = "./models/yolov8s-obb.onnx";
  174. std::string model_path_seg = "./models/yolov8s-seg.onnx";
  175. std::string model_path_pose = "./models/yolov8s-pose.onnx";
  176. cv::Mat src = imread(img_path);
  177. cv::Mat img = src.clone();
  178. Yolov8 task_detect_ocv;
  179. Yolov8PoseOnnx task_detect_ort;
  180. Yolov8Seg task_segment_ocv;
  181. Yolov8SegOnnx task_segment_ort;
  182. Yolov8Obb task_obb_ocv;
  183. Yolov8ObbOnnx task_obb_ort;
  184. Yolov8Pose task_pose_ocv;
  185. Yolov8PoseOnnx task_pose_ort;
  186. RTDETROnnx task_rtdetr_ort;
  187. //yolov8(task_detect_ocv,img,model_path_detect); //yolov8 opencv detect
  188. //img = src.clone();
  189. //yolov8_onnx(task_detect_ort,img,model_path_detect); //yoolov8 onnxruntime detect
  190. //
  191. //img = src.clone();
  192. //yolov8_onnx(task_rtdetr_ort, img, model_path_rtdetr); //yolov8-rtdetr onnxruntime detect
  193. //img = src.clone();
  194. //yolov8(task_segment_ocv,img,model_path_seg); //yolov8 opencv segment
  195. //img = src.clone();
  196. //yolov8_onnx(task_segment_ort,img,model_path_seg); //yolov8 onnxruntime segment
  197. //img = src.clone();
  198. //yolov8(task_obb_ocv, img, model_path_obb); //yolov8 opencv obb
  199. //img = src.clone();
  200. //yolov8_onnx(task_obb_ort, img, model_path_obb); //yolov8 onnxruntime obb
  201. //img = src.clone();
  202. //yolov8(task_pose_ocv, img, model_path_pose); //yolov8 opencv pose
  203. img = src.clone();
  204. yolov8_onnx(task_pose_ort, img, model_path_pose); //yolov8 onnxruntime pose
  205. #ifdef VIDEO_OPENCV
  206. video_demo(task_detect_ocv, model_path_detect);
  207. //video_demo(task_segment_ocv, model_path_seg);
  208. //video_demo(task_pose_ocv, model_path_pose);
  209. #else
  210. //video_demo(task_detect_ort, model_path_detect);
  211. //video_demo(task_rtdetr_ort, model_path_rtdetr);
  212. //video_demo(task_segment_ort, model_path_seg);
  213. //video_demo(task_pose_ort, model_path_pose);
  214. #endif
  215. return 0;
  216. }