main_old.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488
  1. //
  2. // Created by alex on 18-12-8.
  3. //
  4. //
  5. #include <opencv2/opencv.hpp>
  6. #include <opencv2/core/core.hpp>
  7. #include <opencv2/highgui/highgui.hpp>
  8. #include <string>
  9. #include <iostream>
  10. #include <zconf.h>
  11. #include <csignal>
  12. #include <thread>
  13. #include "MvGmslCamera.h"
  14. #include <fstream>
  15. #include <chrono>
  16. #include <fcntl.h>
  17. #include <unistd.h>
  18. #include <sys/ioctl.h>
  19. #include <linux/videodev2.h>
  20. #include <thread>
  21. #define VIDEO_OUT "/dev/video8"
  22. using namespace std::chrono;
  23. using std::string;
  24. sig_atomic_t exitRequested = 0;
  25. uint camera_num = 6;
  26. struct sync_out_a_cfg_client_t stCameraCfgSend = {};
  27. char dev_node[32] = "/dev/video0"; /*不输入-d参数时,默认开启的第一个的设备*/
  28. std::string camera_fmt_str = "UYVY"; /*默认采集的图像格式*/
  29. std::string output_fmt_str = "BGRA32"; /*默认输出的图像格式,支持类型见README*/
  30. // std::string output_fmt_str = "RGB8";
  31. uint cam_w = 1920; /*不输入-s参数时。默认采集摄像头的分辨率*/
  32. uint cam_h = 1080; /*不输入-s参数时。默认采集摄像头的分辨率*/
  33. // true font 1 false back 0
  34. bool MODEL = true;
  35. /*屏幕输出的视频分辨率*/
  36. // uint out_w = 960;
  37. // uint out_h = 540;
  38. // uint out_w = 320;
  39. // uint out_h = 180;
  40. uint64_t timestampbefore[8] = {0}; /*上一次采集图像时采集时间*/
  41. uint64_t LinuxGetFrameTimeBefore[8] = {0}; /*上一次采集图像时的系统时间*/
  42. void handler(int)
  43. {
  44. std::cout << "will exit..." << std::endl;
  45. exitRequested = true;
  46. }
  47. std::string GetCurrentTimeStamp(int time_stamp_type = 0)
  48. {
  49. std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
  50. std::time_t now_time_t = std::chrono::system_clock::to_time_t(now);
  51. std::tm *now_tm = std::localtime(&now_time_t);
  52. char buffer[128];
  53. strftime(buffer, sizeof(buffer), "%F %T", now_tm);
  54. std::ostringstream ss;
  55. ss.fill('0');
  56. std::chrono::milliseconds ms;
  57. std::chrono::microseconds cs;
  58. std::chrono::nanoseconds ns;
  59. switch (time_stamp_type)
  60. {
  61. case 0:
  62. ss << buffer;
  63. break;
  64. case 1:
  65. ms = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()) % 1000;
  66. ss << buffer << ":" << ms.count();
  67. break;
  68. case 2:
  69. ms = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()) % 1000;
  70. cs = std::chrono::duration_cast<std::chrono::microseconds>(now.time_since_epoch()) % 1000000;
  71. ss << buffer << ":" << ms.count() << ":" << cs.count() % 1000;
  72. break;
  73. case 3:
  74. ms = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()) % 1000;
  75. cs = std::chrono::duration_cast<std::chrono::microseconds>(now.time_since_epoch()) % 1000000;
  76. ns = std::chrono::duration_cast<std::chrono::nanoseconds>(now.time_since_epoch()) % 1000000000;
  77. ss << buffer << ":" << ms.count() << ":" << cs.count() % 1000 << ":" << ns.count() % 1000;
  78. break;
  79. default:
  80. ss << buffer;
  81. break;
  82. }
  83. return ss.str();
  84. }
  85. //------------- F 1920 * 1080
  86. cv::Mat meger;
  87. uint meger_width = 2020;
  88. uint meger_height = 970;
  89. // 0 1 2 3 4 5
  90. int f_frame_size[] = {1280, 640, 1280, 640, 640, 360, 640, 360, 640, 320, 640, 320};
  91. cv::Rect f_rectCenter = cv::Rect(370, 330, f_frame_size[0], f_frame_size[1]); // font frame_0
  92. cv::Rect f_rectCenterUp = cv::Rect(650, 0, f_frame_size[2] - 560, f_frame_size[3] - 320); // back frame_1
  93. // cv::Rect frame1_rect = cv::Rect(160, 90, f_frame_size[2] - 320, f_frame_size[3] - 180);
  94. cv::Rect f_rectLeftUp = cv::Rect(0, 330, f_frame_size[5], f_frame_size[4]); // left frame_2
  95. // cv::Rect frame2_rect = cv::Rect(60, 0, f_frame_size[4] - 120, f_frame_size[5]);
  96. cv::Rect f_rectRightUp = cv::Rect(1660, 330, f_frame_size[7], f_frame_size[6]); // right frame_3
  97. // cv::Rect frame3_rect = cv::Rect(60, 0, f_frame_size[6] - 120, f_frame_size[7]);
  98. cv::Mat frame_0, frame_1, frame_2, frame_3;
  99. cv::Mat fCmeraMeger(cv::Mat outMat[])
  100. {
  101. for (uint32_t i = 0; i < 4; i++)
  102. {
  103. cv::cvtColor(outMat[i], outMat[i], cv::COLOR_BGRA2RGB);
  104. switch (i)
  105. {
  106. case 0:
  107. frame_0 = outMat[i];
  108. break;
  109. case 1:
  110. // frame_1 = outMat[i](frame1_rect);
  111. frame_1 = outMat[i];
  112. resize(frame_1, frame_1, cv::Size(720, 320));
  113. break;
  114. case 2:
  115. frame_2 = outMat[i];
  116. // ROTATE_90_CLOCKWISE
  117. // ROTATE_180
  118. // ROTATE_90_COUNTERCLOCKWISE
  119. cv::rotate(frame_2, frame_2, cv::ROTATE_90_COUNTERCLOCKWISE);
  120. break;
  121. case 3:
  122. frame_3 = outMat[i];
  123. cv::rotate(frame_3, frame_3, cv::ROTATE_90_CLOCKWISE);
  124. break;
  125. default:
  126. break;
  127. }
  128. }
  129. // cv::Mat f_meger = cv::Mat::zeros(meger_height, meger_width, frame_0.type());
  130. frame_0.copyTo(meger(f_rectCenter));
  131. frame_1.copyTo(meger(f_rectCenterUp));
  132. frame_2.copyTo(meger(f_rectLeftUp));
  133. frame_3.copyTo(meger(f_rectRightUp));
  134. return meger;
  135. }
  136. // uint meger_width = 1060;
  137. // uint meger_height = 550;
  138. //-------R 1902 * 852 //font_0 back_1 left_2 right_3 cha1_4 cha2_5
  139. int r_frame_size[] = {1280, 640, 1280, 640, 640, 360, 640, 360, 640, 320, 640, 320};
  140. cv::Rect r_rectCenterUp = cv::Rect(650, 0, r_frame_size[0] - 560, r_frame_size[1] - 320); // font frame_0
  141. //cv::Rect r_frame0_rect = cv::Rect(120, 90, r_frame_size[0] - 240, r_frame_size[1] - 180);
  142. cv::Rect r_rectCenter = cv::Rect(370, 330, r_frame_size[2], r_frame_size[3]); // back frame_1
  143. cv::Rect r_rectRightDown = cv::Rect(1660, 330, r_frame_size[5], r_frame_size[4]); // left frame_2
  144. // cv::Rect r_frame2_rect = cv::Rect(60, 0, r_frame_size[4] - 120, r_frame_size[5]);
  145. cv::Rect r_rectLeftDown = cv::Rect(0, 330, r_frame_size[7], r_frame_size[6]); // right frame_3
  146. // cv::Rect r_frame3_rect = cv::Rect(60, 0, r_frame_size[6] - 120, r_frame_size[7]);
  147. cv::Rect r_rectRightUp = cv::Rect(1380, 0, r_frame_size[8], r_frame_size[9]); // chabao left frame_4
  148. cv::Rect r_rectLeftUp = cv::Rect(0, 0, r_frame_size[10], r_frame_size[11]); // chabao right frame_5
  149. cv::Mat r_frame_0, r_frame_1, r_frame_2, r_frame_3, r_frame_4, r_frame_5;
  150. cv::Mat rCmeraMeger(cv::Mat outMat[])
  151. {
  152. for (uint32_t i = 0; i < camera_num; i++)
  153. {
  154. cv::cvtColor(outMat[i], outMat[i], cv::COLOR_BGRA2RGB);
  155. switch (i)
  156. {
  157. case 0:
  158. // r_frame_0 = outMat[i](r_frame0_rect);
  159. r_frame_0 = outMat[i];
  160. resize(r_frame_0, r_frame_0, cv::Size(720, 320));
  161. break;
  162. case 1:
  163. r_frame_1 = outMat[i];
  164. break;
  165. case 2:
  166. r_frame_2 = outMat[i];
  167. cv::rotate(r_frame_2, r_frame_2, cv::ROTATE_90_CLOCKWISE);
  168. break;
  169. case 3:
  170. r_frame_3 = outMat[i];
  171. cv::rotate(r_frame_3, r_frame_3, cv::ROTATE_90_COUNTERCLOCKWISE);
  172. break;
  173. case 4:
  174. r_frame_4 = outMat[i];
  175. break;
  176. case 5:
  177. r_frame_5 = outMat[i];
  178. break;
  179. default:
  180. break;
  181. }
  182. }
  183. // cv::Mat f_meger = cv::Mat::zeros(meger_height, meger_width, frame_0.type());
  184. r_frame_0.copyTo(meger(r_rectCenterUp));
  185. r_frame_1.copyTo(meger(r_rectCenter));
  186. r_frame_2.copyTo(meger(r_rectRightDown));
  187. r_frame_3.copyTo(meger(r_rectLeftDown));
  188. r_frame_4.copyTo(meger(r_rectRightUp));
  189. r_frame_5.copyTo(meger(r_rectLeftUp));
  190. return meger;
  191. }
  192. // 线程
  193. std::ifstream inFile;
  194. char c;
  195. bool current_model = true;
  196. void thread_1()
  197. {
  198. while (1)
  199. {
  200. sleep(0.1);
  201. try
  202. {
  203. std::ifstream inFile("/tmp/vedioFront", std::ios::in | std::ios::binary);
  204. if (!inFile)
  205. {
  206. // std::cout << "error" << std::endl;
  207. // return 0;
  208. }
  209. else
  210. {
  211. inFile.get(c);
  212. inFile.close();
  213. current_model = c - '0';
  214. }
  215. }
  216. catch (const std::exception &e)
  217. {
  218. std::cerr << e.what() << '\n';
  219. }
  220. }
  221. }
  222. /*demo程序主函数,分别打开n个窗口,并通过反复分别调用GetImageCvMat和GetImagePtr接口获取图像和时间戳在窗口中显示*/
  223. int main(int argc, char *argv[])
  224. {
  225. // open output device
  226. int output = open(VIDEO_OUT, O_RDWR);
  227. if (output < 0)
  228. {
  229. std::cerr << "ERROR: could not open output device!\n"
  230. << strerror(errno);
  231. return -2;
  232. }
  233. // configure params for output device
  234. struct v4l2_format vid_format;
  235. memset(&vid_format, 0, sizeof(vid_format));
  236. vid_format.type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
  237. if (ioctl(output, VIDIOC_G_FMT, &vid_format) < 0)
  238. {
  239. std::cerr << "ERROR: unable to get video format!\n"
  240. << strerror(errno);
  241. return -1;
  242. }
  243. // output to video8
  244. size_t framesize = meger_width * meger_height * 3;
  245. vid_format.fmt.pix.width = meger_width;
  246. vid_format.fmt.pix.height = meger_height;
  247. vid_format.fmt.pix.pixelformat = V4L2_PIX_FMT_RGB24;
  248. vid_format.fmt.pix.sizeimage = framesize;
  249. vid_format.fmt.pix.field = V4L2_FIELD_NONE;
  250. if (ioctl(output, VIDIOC_S_FMT, &vid_format) < 0)
  251. {
  252. std::cerr << "ERROR: unable to set video format!\n"
  253. << strerror(errno);
  254. return -1;
  255. }
  256. camera_context_t ctx[8] = {};
  257. stCameraCfgSend.async_camera_num = 0;
  258. stCameraCfgSend.async_freq = 0;
  259. stCameraCfgSend.async_camera_bit_draw = 0;
  260. stCameraCfgSend.sync_camera_num = 8;
  261. stCameraCfgSend.sync_freq = 30;
  262. stCameraCfgSend.sync_camera_bit_draw = 0xff;
  263. // setenv("CHECK_TIME","0",0);
  264. char dev_node_tmp = dev_node[10];
  265. for (int i = 0; i < camera_num; i++)
  266. {
  267. // if( i == 4 || i == 5){
  268. // dev_node[10] = dev_node_tmp + i + 2;
  269. // // dev_node[10] = dev_node_tmp + i;
  270. // }else{
  271. // dev_node[10] = dev_node_tmp + i;
  272. // }
  273. dev_node[10] = dev_node_tmp + i;
  274. ctx[i].dev_node = dev_node;
  275. ctx[i].camera_fmt_str = camera_fmt_str;
  276. ctx[i].output_fmt_str = output_fmt_str;
  277. ctx[i].cam_w = cam_w;
  278. ctx[i].cam_h = cam_h;
  279. ctx[i].out_w = f_frame_size[i * 2];
  280. ctx[i].out_h = f_frame_size[i * 2 + 1];
  281. }
  282. miivii::MvGmslCamera mvcam(ctx, camera_num, stCameraCfgSend);
  283. std::string windowName("DisplayCamera ");
  284. cv::Mat outMat[camera_num];
  285. uint8_t *outbuf[camera_num];
  286. cv::Mat imgbuf[camera_num];
  287. signal(SIGINT, &handler);
  288. bool quit = false;
  289. uint64_t timestamp;
  290. // background
  291. meger = cv::imread("./base.jpg");
  292. cv::cvtColor(meger, meger, cv::COLOR_BGRA2RGB);
  293. resize(meger, meger, cv::Size(meger_width, meger_height));
  294. uint8_t camera_no = dev_node[10] - 0x30;
  295. cv::Mat mege_frame;
  296. int count = 1;
  297. meger = cv::imread("./base.jpg");
  298. cv::cvtColor(meger, meger, cv::COLOR_BGRA2RGB);
  299. resize(meger, meger, cv::Size(meger_width, meger_height));
  300. bool is_open_file = false;
  301. // 读取文件
  302. std::thread file_thread(thread_1);
  303. file_thread.detach();
  304. while (!quit)
  305. {
  306. // count++;
  307. // if (count % 666 == 0)
  308. // {
  309. // if (MODEL)
  310. // {
  311. // MODEL = false;
  312. // meger = cv::imread("./base.jpg");
  313. // cv::cvtColor(meger, meger, cv::COLOR_BGRA2RGB);
  314. // resize(meger, meger, cv::Size(meger_width, meger_height));
  315. // }
  316. // else
  317. // {
  318. // MODEL = true;
  319. // meger = cv::imread("./base.jpg");
  320. // cv::cvtColor(meger, meger, cv::COLOR_BGRA2RGB);
  321. // resize(meger, meger, cv::Size(meger_width, meger_height));
  322. // }
  323. // count = 1;
  324. // }
  325. // meger = cv::imread("./base.jpg");
  326. // cv::cvtColor(meger, meger, cv::COLOR_BGRA2RGB);
  327. // resize(meger, meger, cv::Size(meger_width, meger_height));
  328. // inFile.seekg(0);
  329. // std::cout << "-------" << std::endl;
  330. // std::cout << c << std::endl;
  331. if (exitRequested)
  332. {
  333. quit = true;
  334. break;
  335. }
  336. /*use cv data to get image*/
  337. if (mvcam.GetImageCvMat(outMat, timestamp, camera_no))
  338. {
  339. // for (uint32_t i = 0; i < camera_num; i++)
  340. // {
  341. // // cv::cvtColor(outMat[i], outMat[i], cv::COLOR_BGRA2BGR);
  342. // // cv::Rect rect = cv::Rect(0, 0, 320, 180);
  343. // cv::cvtColor(outMat[i], outMat[i], cv::COLOR_BGRA2RGB);
  344. // cv::Mat tempMat = outMat[i];
  345. // // mege_frame = cv::Mat::zeros(500, 500, tempMat.type());
  346. // tempMat.copyTo(mege_frame);
  347. // // cv::imshow(windowName + std::to_string(i), mege_frame);
  348. // }
  349. // std::cout << MODEL << std::endl;
  350. if (current_model != MODEL)
  351. {
  352. meger = cv::imread("./base.jpg");
  353. cv::cvtColor(meger, meger, cv::COLOR_BGRA2RGB);
  354. resize(meger, meger, cv::Size(meger_width, meger_height));
  355. MODEL = current_model;
  356. }
  357. if (MODEL)
  358. {
  359. mege_frame = fCmeraMeger(outMat);
  360. }
  361. else
  362. {
  363. mege_frame = rCmeraMeger(outMat);
  364. // 锁钩
  365. // cv::Rect rect = cv::Rect(85, 85, 20, 40);
  366. // cv::Scalar color = cv::Scalar(250, 250, 100);
  367. //cv::Scalar color = cv::Scalar(0, 255, 0);
  368. //cv::Scalar color1 = cv::Scalar(255, 0, 0);
  369. // cv::rectangle(mege_frame, rect, color, 2, cv::LINE_8);
  370. // cv::Rect rect1 = cv::Rect(930, 80, 20, 40);
  371. // cv::rectangle(mege_frame, rect1, color, 2, cv::LINE_8);
  372. // 放包前后对准线
  373. //cv::line(mege_frame, cv::Point(320, 330), cv::Point(350, 330), color, 2, cv::LINE_8);
  374. //cv::line(mege_frame, cv::Point(730, 345), cv::Point(760, 345), color, 2, cv::LINE_8);
  375. //cv::line(mege_frame, cv::Point(320, 360), cv::Point(350, 360), color1, 2, cv::LINE_8);
  376. //cv::line(mege_frame, cv::Point(730, 375), cv::Point(760, 375), color1, 2, cv::LINE_8);
  377. // 倒包对准线
  378. // cv::line(mege_frame, cv::Point(400, 300), cv::Point(400, 400), color, 2, cv::LINE_8);
  379. // cv::line(mege_frame, cv::Point(710, 300), cv::Point(710, 400), color, 2, cv::LINE_8);
  380. }
  381. cv::putText(mege_frame, GetCurrentTimeStamp(1), cv::Point(800, 30), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255, 255, 255), 2);
  382. // cv::imshow(windowName, mege_frame);
  383. // size_t framesize = 320 * 180 * 3;
  384. // vid_format.fmt.pix.width = 320;
  385. // vid_format.fmt.pix.height = 180;
  386. // write frame to output device
  387. size_t written = write(output, mege_frame.data, framesize);
  388. if (written < 0)
  389. {
  390. std::cerr << "ERROR: could not write to output device!\n";
  391. close(output);
  392. break;
  393. }
  394. }
  395. else
  396. {
  397. std::cerr << "Can't get image form camera." << std::endl;
  398. }
  399. if (cv::waitKey(1) == 27)
  400. { // Wait for 'esc' key press to exit
  401. break;
  402. }
  403. sleep(0.001);
  404. }
  405. close(output);
  406. return 0;
  407. }