QtCameraHardWareCopilot.cpp 79 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014
  1. #include "QtCameraHardWareCopilot.h"
  2. #include "Timer.h"
  3. #include "json.hpp"
  4. #include <mutex>
  5. bool QtCameraHardWareCopilot::s_bSwitchProcess = true;
  6. const float VERTICAL_CAMERA_WIDTH = 3.76963;
  7. const float VERTICAL_CAMERA_HEIGHT = 5.45;
  8. const float HORIZONTAL_CAMERA_WIDTH = 6;
  9. const float HORIZONTAL_CAMERA_HEIGHT = 4.5;
  10. QtCameraHardWareCopilot::QtCameraHardWareCopilot(QWidget *parent)
  11. : QMainWindow(parent)
  12. {
  13. ui.setupUi(this);
  14. //init timer
  15. m_pUpdateTimer = new QTimer(this);
  16. m_pUpdateTimer->setInterval(40);
  17. SetConnect();
  18. //init the QtlineEditors
  19. ui.HorizontalOffsetEdit->init("0", true, PANO_IMAGE_BOUNDING_WIDTH);
  20. ui.VerticalOffsetEdit->init("0", true, PANO_IMAGE_BOUNDING_WIDTH);
  21. ui.LightEdit->init("0", true, 255);
  22. //init the CameraQueueScene
  23. ui.OffsetOverviewView->setScene(&m_CameraQueueScene);
  24. //init the CameraQueueScene rect
  25. //m_CameraQueueScene.setSceneRect(0, 0, ui.OffsetOverviewView->width(), ui.OffsetOverviewView->height());
  26. //init the combox of the Modify model
  27. ui.comboBoxSelectModel->insertItem(0,QString::fromLocal8Bit("单个相机"));
  28. ui.comboBoxSelectModel->insertItem(1,QString::fromLocal8Bit("相机组"));
  29. ui.comboBoxSelectModel->setCurrentIndex(0);
  30. emit ui.comboBoxSelectModel->currentIndexChanged(0);
  31. ui.OffsetOverviewView->setMouseTracking(true);
  32. ui.OffsetOverviewView->viewport()->rect().setRect(0,0,CAMERA_SCENE_WIDTH,CAMERA_SCENE_HEIGHT);
  33. ui.OffsetOverviewView->setDragMode(ui.OffsetOverviewView->NoDrag);
  34. ui.OffsetOverviewView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
  35. ui.OffsetOverviewView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
  36. //init the current Selected CameraItem pointer
  37. m_pCurrentCameraItem = nullptr;
  38. //init the Camerainfo pointer
  39. m_pCurrentCameraInfo = nullptr;
  40. m_CurrentFramePtr = nullptr;
  41. //init the pano image
  42. m_pPanoImageBuffer = nullptr;
  43. m_nPanoWidth = 0;
  44. m_nPanoHeight = 0;
  45. m_nPanoPitch = 0;
  46. m_pUpdateTimer->start();
  47. m_PanoPainter.SetPixmap(&m_PanoPixmap);
  48. m_pRefreshProcessThread = new std::thread(ThreadProcessAll, this);
  49. m_pRefreshProcessThread->detach();
  50. m_CurShowMode = ShowMode::Fit;
  51. m_bMousePressOrNot = false;
  52. m_bCameraItemModified = false;
  53. m_bBlockThread = false;
  54. m_StitchingTailor.bUseYUV = false;
  55. m_bCameraItemMoveModel = true;
  56. CameraItem::pCameraItemModified = &m_bCameraItemModified;
  57. //init the m_grouplist
  58. m_CameraItemList.clear();
  59. m_CameraQueueScene.SetGripper(&m_CameraGripper);
  60. m_fCameraSubStreamToMainStreamHeight = VERTICAL_CAMERA_HEIGHT;
  61. m_fCameraSubStreamToMainStreamWidth = VERTICAL_CAMERA_WIDTH;
  62. }
  63. QtCameraHardWareCopilot::~QtCameraHardWareCopilot()
  64. {
  65. }
  66. bool QtCameraHardWareCopilot::reFreshAllCameraFrame(QtCameraHardWareCopilot* pClass)
  67. {
  68. //use all the CameraItem to update the image
  69. int nCurIndex = 0;
  70. for (auto& group : pClass->m_CameraItemList)
  71. {
  72. for (auto& item : group.CameraItemGroup)
  73. {
  74. //prepare the image demands param
  75. int nWidth; int nHeight; int nPicth;
  76. unsigned char* pImage = NULL;
  77. //use the CameraItem to update the image
  78. if (!item.bActive)
  79. continue;
  80. cv::Mat& matFromI420 = item.m_CurrentFrame;
  81. if (item.m_VideoStreamCatcher.m_pVideoDataManager->GetDecoderDataCount() <= 0)
  82. {
  83. continue;
  84. }
  85. item.m_VideoStreamCatcher.GetVideoImage(pImage, nWidth, nHeight, nPicth);
  86. {
  87. cv::Mat YUVImageYChannel = cv::Mat(nHeight, nWidth, CV_8UC3, pImage);
  88. cv::add(YUVImageYChannel, cv::Scalar(item.m_CameraInfo.nLightOffset), YUVImageYChannel);
  89. }
  90. g_CurFrameMutex.lock();
  91. matFromI420.deallocate();
  92. if (pClass->m_StitchingTailor.bUseYUV)
  93. {
  94. matFromI420 = cv::Mat(nHeight, nWidth, CV_8UC1, pImage);
  95. //libyuv::CopyRow_Any_SSE2(pImage, matFromI420.data, matFromI420.step * matFromI420.rows);
  96. }
  97. else
  98. {
  99. matFromI420 = cv::Mat(nHeight, nWidth, CV_8UC3, pImage);
  100. }
  101. item.m_VideoStreamCatcher.m_pVideoDataManager->ReleaseDecoderData(item.pCurrentFrame);
  102. item.pCurrentFrame = pImage;
  103. g_CurFrameMutex.unlock();
  104. //calculate the lefttop pt in the PanoImage
  105. int StitchingLeft = PANO_IMAGE_BOUNDING_WIDTH + item.nItemColIndex * nWidth + item.m_CameraInfo.nHorizonOffset;
  106. int StitchingTop = PANO_IMAGE_BOUNDING_WIDTH + item.nItemRowIndex * nHeight + item.m_CameraInfo.nVerticalOffset;
  107. pClass->m_StitchingTailor.AddWorkOrderInqueue(cv::Point(StitchingLeft, StitchingTop),
  108. //item->pCurrentFrame,nWidth,nHeight,nPicth,
  109. &item.m_CurrentFrame,
  110. &item.m_vvOverlapBounding);
  111. }
  112. }
  113. return true;
  114. }
  115. void QtCameraHardWareCopilot::reFreshAllCameraFrameGpu()
  116. {
  117. //use all the CameraItem to update the image
  118. int nCurIndex = 0;
  119. for (auto& group : m_CameraItemList)
  120. {
  121. for (auto& item : group.CameraItemGroup)
  122. {
  123. //prepare the image demands param
  124. int nWidth; int nHeight; int nPicth;
  125. unsigned char* pImage = nullptr;
  126. //use the CameraItem to update the image
  127. GPU_DATA& CurGpuData = item.m_CurrentGpuData;
  128. if (item.m_VideoStreamCatcher.m_pVideoDataManager->GetDecoderDataCount() <= 0)
  129. continue;
  130. item.m_VideoStreamCatcher.GetVideoImage(pImage, nWidth, nHeight, nPicth);
  131. //{
  132. // cv::Mat YUVImageYChannel = cv::Mat(nHeight, nWidth, CV_8UC1, pImage);
  133. // cv::add(YUVImageYChannel, cv::Scalar(item->m_CameraInfo.nLightOffset), YUVImageYChannel);
  134. //}
  135. //g_CurFrameMutex.lock();
  136. cudaError Err = cudaFree(CurGpuData.pData);
  137. CurGpuData.pData = pImage;
  138. CurGpuData.nWidth = nWidth;
  139. CurGpuData.nHeight = nHeight;
  140. CurGpuData.nPitch = nPicth;
  141. //g_CurFrameMutex.unlock();
  142. //calculate the lefttop pt in the PanoImage
  143. int StitchingLeft = PANO_IMAGE_BOUNDING_WIDTH + item.nItemColIndex * nWidth + item.m_CameraInfo.nHorizonOffset;
  144. int StitchingTop = PANO_IMAGE_BOUNDING_WIDTH + item.nItemRowIndex * nHeight + item.m_CameraInfo.nVerticalOffset;
  145. m_StitchingTailor.StitchingOnPanoYUVByGPU(cv::Point(StitchingLeft, StitchingTop),
  146. item.m_CurrentGpuData.pData,
  147. item.m_CurrentGpuData.nWidth,
  148. item.m_CurrentGpuData.nHeight,
  149. item.m_CurrentGpuData.nPitch,
  150. &item.m_vvOverlapBounding);
  151. /* m_StitchingTailor.AddWorkOrderInQueueGpu(
  152. cv::Point(StitchingLeft, StitchingTop),
  153. item->m_CurrentGpuData.pData,
  154. item->m_CurrentGpuData.nWidth,
  155. item->m_CurrentGpuData.nHeight,
  156. item->m_CurrentGpuData.nPitch,
  157. &item->m_vvOverlapBounding);*/
  158. }
  159. }
  160. }
  161. /// <summary>
  162. /// set a function to achieve Image fusion
  163. /// </summary>
  164. /// <param name="pClass">The pointer to mainwindow class.</param>
  165. void QtCameraHardWareCopilot::LaplaceImageFusion(QtCameraHardWareCopilot* pClass)
  166. {
  167. ////use opencv to achieve the image fusion
  168. ////first to get the panoImage size
  169. //int nPanoWidth = pClass->m_nPanoWidth;
  170. //int nPanoHeight = pClass->m_nPanoHeight;
  171. //int nPanoPicth = pClass->m_nPanoPitch;
  172. ////set a iter to get the CameraItem
  173. //std::list<CameraItem*>::iterator Iter = pClass->m_CameraItemList.begin();
  174. ////Calculate the Current Stitching Rect
  175. //int nListSize = int(pClass->m_CameraItemList.size());
  176. //if (nListSize < 2)
  177. // return;
  178. //for (int i = 0; i < nListSize; i++)
  179. //{
  180. // if ((*Iter)->pIntersectInstance == NULL)
  181. // continue;
  182. // //Use quote to get the CameraItem
  183. // CameraItem& CameraItem1 = **(Iter);
  184. // CameraItem& CameraItem2 = *((*Iter)->pIntersectInstance);
  185. // //Widen the overlap Rect
  186. // MfcLabel::fRect OverlapRect = CameraItem1.IntersectRect;
  187. // /*int OverLapLeft = PANO_IMAGE_BOUNDING_WIDTH + CameraItem1.m_CameraInfo.nHorizonOffset + CameraItem1.m_VideoStreamCatcher.m_nVideoWidth * CameraItem1.nItemIndex - 10;
  188. // int OverLapRight = OverLapLeft + CameraItem1.IntersectRect.width() + 20;
  189. // int OverLapTop = PANO_IMAGE_BOUNDING_WIDTH + CameraItem1.m_CameraInfo.nVerticalOffset - 10;
  190. // */
  191. // //OverlapRect.Left = OverlapRect.Left-10 < 0 ? 0 : OverlapRect.Left-10;
  192. // // OverlapRect.Right = OverlapRect.Right+10 > pClass->m_nPanoWidth ? pClass->m_nPanoWidth : OverlapRect.Right+10;
  193. // //OverlapRect.Top += PANO_IMAGE_BOUNDING_WIDTH;
  194. // //OverlapRect.Bottom += PANO_IMAGE_BOUNDING_WIDTH;
  195. // //get target image point
  196. // //unsigned char* pTargetImage = pClass->m_pPanoImageBuffer + OverlapRect.Top * nPanoPicth + OverlapRect.Left * 3;
  197. // //calculate the laplace fusion in widen intersect
  198. // pClass->m_ImageFusion.FusionImageByLaplacePyramid(
  199. // pClass->m_pPanoImageBuffer,
  200. // cv::Rect(OverlapRect.Left, OverlapRect.Top, OverlapRect.Width(), OverlapRect.Height()),
  201. // NULL,
  202. // cv::Size(0,0),
  203. // 3,
  204. // 3,
  205. // 0.5,
  206. // cv::Point(0,0)
  207. // );
  208. //}
  209. }
  210. void QtCameraHardWareCopilot::AddWeightColorBalance(QtCameraHardWareCopilot* pClass)
  211. {
  212. // //calculate the weight of each camera
  213. // //define a iter to get the CameraItem
  214. // std::list<CameraItem*>::iterator Iter = pClass->m_CameraItemList.begin();
  215. // //define a int to get the list size
  216. // int nListSize = int(pClass->m_CameraItemList.size());
  217. // //if size is less than 2,its dont have a intersect, return
  218. // if (nListSize < 2)
  219. //return;
  220. // //calculate the rect need to be balanced
  221. // for (int Item = 0; Item < nListSize; Item++)
  222. // {
  223. // CameraItem& CameraInfer = **Iter;
  224. // if ((*Iter)->pIntersectInstance == NULL)
  225. // continue;
  226. // CameraItem& CameraTarget = *((*Iter)->pIntersectInstance);
  227. // //get the camera1 intersect rect
  228. // MfcLabel::fRect IntersectRect = CameraInfer.IntersectRect;
  229. // //get the camera2 intersect rect
  230. // MfcLabel::fRect IntersectRect2 = CameraInfer.IntersectRect;
  231. // IntersectRect2.Left = 0;
  232. // IntersectRect2.Right = CameraInfer.IntersectRect.width();//IntersectRect2.Right - CameraTarget.nItemIndex* CameraTarget.m_VideoStreamCatcher.m_nVideoWidth - CameraTarget.m_CameraInfo.nHorizonOffset - PANO_IMAGE_BOUNDING_WIDTH;
  233. // IntersectRect2.Top = CameraInfer.m_CameraInfo.nVerticalOffset < 0 ? -CameraInfer.m_CameraInfo.nVerticalOffset : 0;
  234. // IntersectRect2.Bottom = IntersectRect2.Top + CameraInfer.IntersectRect.height();
  235. // //get the target image
  236. // unsigned char* pTargetImage = NULL;
  237. // int nTargetWidth = 0;
  238. // int nTargetHeight = 0;
  239. // int nTargetPitch = 0;
  240. // cv::Mat& matTarget = CameraTarget.m_CurrentFrame;
  241. // nTargetWidth = matTarget.cols;
  242. // nTargetHeight = matTarget.rows;
  243. // nTargetPitch = matTarget.step;
  244. // pTargetImage = matTarget.data;
  245. // pClass->m_ImageColorBalance.FusionImageByBorderColor(
  246. // pClass->m_pPanoImageBuffer,
  247. // cv::Rect(IntersectRect.Left, IntersectRect.Top, IntersectRect.Width(), IntersectRect.Height()),
  248. // pTargetImage,
  249. // cv::Rect(IntersectRect2.Left, IntersectRect2.Top, IntersectRect2.Width(), IntersectRect2.Height())
  250. // );
  251. // int X = 10;
  252. // }
  253. //check current frequency count
  254. //int& FrequencyCount = pClass->m_ImageColorBalance.GetRefreshFrequency();
  255. //if(FrequencyCount == 0)
  256. //{
  257. // FrequencyCount = pClass->m_ImageColorBalance.GetStdRefreshFrequency();
  258. // //Complete once balance weight calculate
  259. //}
  260. //else
  261. //{
  262. // FrequencyCount--;
  263. //}
  264. }
  265. void QtCameraHardWareCopilot::ThreadProcessAll(QtCameraHardWareCopilot* pClass)
  266. {
  267. //set a while to process all data from decoder
  268. while (s_bSwitchProcess)
  269. {
  270. if (!pClass->m_bBlockThread && !pClass->m_bCameraItemModified)
  271. {
  272. if (pClass->m_pPanoImageBuffer == NULL)
  273. continue;
  274. reFreshAllCameraFrame(pClass);
  275. //pClass->MeanWeightBalanceImage();
  276. //pClass->PushImageToQueue();
  277. pClass->m_ImageFusion.Init(pClass->m_pPanoImageBuffer, pClass->m_nPanoWidth, pClass->m_nPanoHeight, pClass->m_nPanoPitch);
  278. if (pClass->m_CameraItemList.size() != 0)
  279. pClass->m_ImageColorBalance.Init(pClass->m_pPanoImageBuffer, pClass->m_nPanoWidth, pClass->m_nPanoHeight, pClass->m_nPanoPitch,
  280. pClass->m_CameraItemList.front().CameraItemGroup.front().m_VideoStreamCatcher.m_nOutputImageWidth,
  281. pClass->m_CameraItemList.front().CameraItemGroup.front().m_VideoStreamCatcher.m_nOutputImageHeight,
  282. pClass->m_CameraItemList.front().CameraItemGroup.front().m_VideoStreamCatcher.m_nOutputImagePitch,
  283. 25);
  284. //calculate overlap rect
  285. //AddWeightColorBalance(pClass);
  286. //pClass->ThinRectWindowMeanImage(pClass);
  287. // pClass->BlendingGradientImage(pClass);
  288. }
  289. else
  290. {
  291. while (pClass->m_StitchingTailor.bTailorThreadWork)
  292. {
  293. continue;
  294. }
  295. g_PanoMutex.lock();
  296. pClass->m_StitchingTailor.ClearWorkOrder();
  297. if (pClass->m_bCameraItemModified)
  298. {
  299. pClass->ResetPanoImageBuffer();
  300. }
  301. pClass->m_StitchingTailor.Init(pClass->m_pPanoImageBuffer, pClass->m_nPanoWidth, pClass->m_nPanoHeight,cv::Point(0,0));
  302. pClass->CalculateAllItemIntersectRectWithOutBlender();
  303. g_PanoMutex.unlock();
  304. }
  305. }
  306. }
  307. void QtCameraHardWareCopilot::ThreadProcessAllGpu(QtCameraHardWareCopilot* pClass)
  308. {
  309. //set a while to process all data from decoder
  310. while (s_bSwitchProcess)
  311. {
  312. if (!pClass->m_bBlockThread && !pClass->m_bCameraItemModified)
  313. {
  314. if (pClass->m_pPanoImageBuffer == NULL)
  315. continue;
  316. TimerCounter Timer;
  317. pClass->reFreshAllCameraFrameGpu();
  318. pClass->m_ImageFusion.Init(pClass->m_pPanoImageBuffer, pClass->m_nPanoWidth, pClass->m_nPanoHeight, pClass->m_nPanoPitch);
  319. pClass->m_ImageFusion.Init_Gpu(pClass->m_pPanoImageBufferGPU, pClass->m_nPanoWidth, pClass->m_nPanoHeight, pClass->m_nPanoPitch);
  320. Timer.Start();
  321. //calculate overlap rect
  322. //AddWeightColorBalance(pClass);
  323. //pClass->ThinRectWindowMeanImage(pClass);
  324. pClass->BlendingGradientImageGpu();
  325. Timer.Stop();
  326. double nTime = Timer.GetTime();
  327. int x = 0;
  328. }
  329. else
  330. {
  331. while (pClass->m_StitchingTailor.bTailorThreadWork)
  332. {
  333. continue;
  334. }
  335. g_PanoMutex.lock();
  336. pClass->m_StitchingTailor.ClearWorkOrder();
  337. if (pClass->m_bCameraItemModified)
  338. {
  339. pClass->ResetPanoImageBuffer();
  340. }
  341. pClass->m_StitchingTailor.Init_Gpu(pClass->m_pPanoImageBuffer,pClass->m_pPanoImageBufferGPU, pClass->m_nPanoWidth, pClass->m_nPanoHeight, cv::Point(0, 0));
  342. pClass->CalculateAllItemIntersectRect();
  343. g_PanoMutex.unlock();
  344. }
  345. }
  346. }
  347. void QtCameraHardWareCopilot::ThinRectWindowMeanImage(QtCameraHardWareCopilot* pClass)
  348. {
  349. //first to get the panoImage size
  350. int nPanoWidth = m_nPanoWidth;
  351. int nPanoHeight = m_nPanoHeight;
  352. int nPanoPicth = m_nPanoPitch;
  353. //define a list iterator to get the group of CameraItem
  354. std::list<TAG_CAM_ROW_GROUP>::iterator Group = m_CameraItemList.begin();
  355. for (int Row = 0; Row <int(m_CameraItemList.size()); Row++)
  356. {
  357. //set a iter to get the CameraItem
  358. std::list<CameraItem>::iterator Iter = (Group)->CameraItemGroup.begin();
  359. //Calculate the Current Stitching Rect
  360. int nListSize = int((Group++)->CameraItemGroup.size());
  361. if (nListSize < 2)
  362. continue;
  363. for (int i = 0; i < nListSize; i++)
  364. {
  365. if ((*Iter).pIntersectInstance == NULL)
  366. continue;
  367. //Use quote to get the CameraItem
  368. CameraItem& CameraItem1 = *(Iter);
  369. CameraItem& CameraItem2 = *((*Iter).pIntersectInstance);
  370. //Widen the overlap Rect
  371. MfcLabel::fRect OverlapRect = CameraItem1.IntersectRect;
  372. //扩展窗口
  373. OverlapRect.Left -= 10;
  374. OverlapRect.Right += 10;
  375. QRectF CurCameraItemRect(
  376. PANO_IMAGE_BOUNDING_WIDTH + CameraItem1.m_CameraInfo.nHorizonOffset + CameraItem1.m_VideoStreamCatcher.m_nVideoWidth * CameraItem1.nItemColIndex,
  377. PANO_IMAGE_BOUNDING_WIDTH + CameraItem1.m_CameraInfo.nVerticalOffset,
  378. CameraItem1.m_VideoStreamCatcher.m_nVideoWidth,
  379. CameraItem1.m_VideoStreamCatcher.m_nVideoHeight
  380. );
  381. QRectF NextCameraItemRect(
  382. PANO_IMAGE_BOUNDING_WIDTH + CameraItem2.m_CameraInfo.nHorizonOffset + CameraItem2.m_VideoStreamCatcher.m_nVideoWidth * CameraItem2.nItemColIndex,
  383. PANO_IMAGE_BOUNDING_WIDTH + CameraItem2.m_CameraInfo.nVerticalOffset,
  384. CameraItem2.m_VideoStreamCatcher.m_nVideoWidth,
  385. CameraItem2.m_VideoStreamCatcher.m_nVideoHeight
  386. );
  387. QRect InferImageRect = CameraItem1.IntersectRect;
  388. InferImageRect.setLeft(InferImageRect.left() - PANO_IMAGE_BOUNDING_WIDTH - CameraItem1.m_CameraInfo.nHorizonOffset
  389. - CameraItem1.m_VideoStreamCatcher.m_nVideoWidth * CameraItem1.nItemColIndex - 10);
  390. InferImageRect.setTop(InferImageRect.top() - PANO_IMAGE_BOUNDING_WIDTH - CameraItem1.m_CameraInfo.nVerticalOffset);
  391. InferImageRect.setWidth(CameraItem1.IntersectRect.width() + 10);
  392. InferImageRect.setHeight(CameraItem1.IntersectRect.height());
  393. QRect TargetImageRect = CameraItem2.PreIntersectRect;
  394. TargetImageRect.setLeft(TargetImageRect.left() - PANO_IMAGE_BOUNDING_WIDTH - CameraItem2.m_CameraInfo.nHorizonOffset
  395. - CameraItem2.m_VideoStreamCatcher.m_nVideoWidth * CameraItem2.nItemColIndex - 10);
  396. TargetImageRect.setTop(TargetImageRect.top() - PANO_IMAGE_BOUNDING_WIDTH - CameraItem2.m_CameraInfo.nVerticalOffset);
  397. TargetImageRect.setWidth(CameraItem2.PreIntersectRect.width() + 10);
  398. TargetImageRect.setHeight(CameraItem2.PreIntersectRect.height());
  399. m_ImageFusion.FusionImageByThinRectWindowSlideMean(
  400. m_pPanoImageBuffer,
  401. cv::Rect(OverlapRect.Left, OverlapRect.Top, OverlapRect.Width(), OverlapRect.Height()),
  402. CameraItem1.m_CurrentFrame,
  403. cv::Rect(InferImageRect.x(), InferImageRect.y(), InferImageRect.width(), InferImageRect.height()),
  404. CameraItem2.m_CurrentFrame,
  405. cv::Rect(TargetImageRect.x(), TargetImageRect.y(), CameraItem2.PreIntersectRect.width(), CameraItem2.PreIntersectRect.height()),
  406. 5,
  407. 0,
  408. 1.5);
  409. Iter++;
  410. }
  411. }
  412. }
  413. void QtCameraHardWareCopilot::PushImageToQueue()
  414. {
  415. int nCurIndex = 0;
  416. for (auto& Group : m_CameraItemList)
  417. {
  418. for (auto& item : Group.CameraItemGroup)
  419. {
  420. //prepare the image demands param
  421. int nWidth; int nHeight; int nPicth;
  422. unsigned char* pImage = NULL;
  423. //use the CameraItem to update the image
  424. cv::Mat& matFromI420 = item.m_CurrentFrame;
  425. nWidth = matFromI420.cols;
  426. nHeight = matFromI420.rows;
  427. nPicth = matFromI420.step[0];
  428. if (nWidth == 0 || nHeight == 0)
  429. continue;
  430. //calculate the lefttop pt in the PanoImage
  431. int StitchingLeft = PANO_IMAGE_BOUNDING_WIDTH + item.nItemColIndex * nWidth + item.m_CameraInfo.nHorizonOffset;
  432. int StitchingTop = PANO_IMAGE_BOUNDING_WIDTH + 0 + item.m_CameraInfo.nVerticalOffset;
  433. m_StitchingTailor.AddWorkOrderInqueue(cv::Point(StitchingLeft, StitchingTop),
  434. //item->pCurrentFrame,nWidth,nHeight,nPicth,
  435. &item.m_CurrentFrame,
  436. &item.m_vvOverlapBounding);
  437. }
  438. }
  439. }
  440. void QtCameraHardWareCopilot::BlendingGradientImage(QtCameraHardWareCopilot* pClass)
  441. {
  442. //first to get the panoImage size
  443. int nPanoWidth = m_nPanoWidth;
  444. int nPanoHeight = m_nPanoHeight;
  445. int nPanoPicth = m_nPanoPitch;
  446. //define a list iterator to get the group of CameraItem
  447. std::list<TAG_CAM_ROW_GROUP>::iterator Group = m_CameraItemList.begin();
  448. for (int Row = 0; Row <int(m_CameraItemList.size()); Row++)
  449. {
  450. //set a iter to get the CameraItem
  451. std::list<CameraItem>::iterator Iter = (Group) ->CameraItemGroup.begin();
  452. //Calculate the Current Stitching Rect
  453. int nListSize = int((Group++)->CameraItemGroup.size());
  454. if (nListSize < 2)
  455. continue;
  456. for (int i = 0; i < nListSize; i++)
  457. {
  458. if (!(*Iter).bActive)
  459. continue;
  460. if ((*Iter).pIntersectInstance == NULL)
  461. continue;
  462. //Use quote to get the CameraItem
  463. CameraItem& CameraItem1 = *(Iter);
  464. CameraItem& CameraItem2 = *((*Iter).pIntersectInstance);
  465. //Widen the overlap Rect
  466. MfcLabel::fRect OverlapRect = CameraItem1.IntersectRect;
  467. //扩展窗口
  468. OverlapRect.Left -= 0;
  469. OverlapRect.Right += 0;
  470. QRectF CurCameraItemRect(
  471. PANO_IMAGE_BOUNDING_WIDTH + CameraItem1.m_CameraInfo.nHorizonOffset + CameraItem1.m_VideoStreamCatcher.m_nVideoWidth * CameraItem1.nItemColIndex,
  472. PANO_IMAGE_BOUNDING_WIDTH + CameraItem1.m_CameraInfo.nVerticalOffset,
  473. CameraItem1.m_VideoStreamCatcher.m_nVideoWidth,
  474. CameraItem1.m_VideoStreamCatcher.m_nVideoHeight
  475. );
  476. QRectF NextCameraItemRect(
  477. PANO_IMAGE_BOUNDING_WIDTH + CameraItem2.m_CameraInfo.nHorizonOffset + CameraItem2.m_VideoStreamCatcher.m_nVideoWidth * CameraItem2.nItemColIndex,
  478. PANO_IMAGE_BOUNDING_WIDTH + CameraItem2.m_CameraInfo.nVerticalOffset,
  479. CameraItem2.m_VideoStreamCatcher.m_nVideoWidth,
  480. CameraItem2.m_VideoStreamCatcher.m_nVideoHeight
  481. );
  482. QRect InferImageRect = CameraItem1.IntersectRect;
  483. InferImageRect.setLeft(InferImageRect.left() - PANO_IMAGE_BOUNDING_WIDTH - CameraItem1.m_CameraInfo.nHorizonOffset
  484. - CameraItem1.m_VideoStreamCatcher.m_nVideoWidth * CameraItem1.nItemColIndex);
  485. InferImageRect.setTop(InferImageRect.top() - PANO_IMAGE_BOUNDING_WIDTH - CameraItem1.m_CameraInfo.nVerticalOffset);
  486. InferImageRect.setWidth(CameraItem1.IntersectRect.width());
  487. InferImageRect.setHeight(CameraItem1.IntersectRect.height());
  488. QRect TargetImageRect = CameraItem2.PreIntersectRect;
  489. TargetImageRect.setLeft(TargetImageRect.left() - PANO_IMAGE_BOUNDING_WIDTH - CameraItem2.m_CameraInfo.nHorizonOffset
  490. - CameraItem2.m_VideoStreamCatcher.m_nVideoWidth * CameraItem2.nItemColIndex);
  491. TargetImageRect.setTop(TargetImageRect.top() - PANO_IMAGE_BOUNDING_WIDTH - CameraItem2.m_CameraInfo.nVerticalOffset);
  492. TargetImageRect.setWidth(CameraItem2.PreIntersectRect.width());
  493. TargetImageRect.setHeight(CameraItem2.PreIntersectRect.height());
  494. if (m_StitchingTailor.bUseYUV)
  495. {
  496. m_ImageFusion.FusionImageByBlendingGradientYUV(
  497. m_pPanoImageBuffer,
  498. cv::Rect(OverlapRect.Left, OverlapRect.Top, OverlapRect.Width(), OverlapRect.Height()),
  499. CameraItem1.m_CurrentFrame.data, CameraItem1.m_CurrentFrame.cols, CameraItem1.m_CurrentFrame.rows, CameraItem1.m_CurrentFrame.step,
  500. cv::Rect(InferImageRect.x(), InferImageRect.y(), InferImageRect.width(), InferImageRect.height()),
  501. CameraItem2.m_CurrentFrame.data, CameraItem2.m_CurrentFrame.cols, CameraItem2.m_CurrentFrame.rows, CameraItem2.m_CurrentFrame.step,
  502. cv::Rect(TargetImageRect.x(), TargetImageRect.y(), CameraItem2.PreIntersectRect.width(), CameraItem2.PreIntersectRect.height()),
  503. false
  504. );
  505. }
  506. else {
  507. m_ImageFusion.FusionImageByBlendingGradient(
  508. m_pPanoImageBuffer,
  509. cv::Rect(OverlapRect.Left, OverlapRect.Top, OverlapRect.Width(), OverlapRect.Height()),
  510. CameraItem1.m_CurrentFrame,
  511. cv::Rect(InferImageRect.x(), InferImageRect.y(), InferImageRect.width(), InferImageRect.height()),
  512. CameraItem2.m_CurrentFrame,
  513. cv::Rect(TargetImageRect.x(), TargetImageRect.y(), CameraItem2.PreIntersectRect.width(), CameraItem2.PreIntersectRect.height()));
  514. }
  515. Iter++;
  516. }
  517. }
  518. }
  519. void QtCameraHardWareCopilot::BlendingGradientImageGpu()
  520. {
  521. //first to get the panoImage size
  522. int nPanoWidth = m_nPanoWidth;
  523. int nPanoHeight = m_nPanoHeight;
  524. int nPanoPicth = m_nPanoPitch;
  525. //define a list iterator to get the group of CameraItem
  526. std::list<TAG_CAM_ROW_GROUP>::iterator Group = m_CameraItemList.begin();
  527. for (int Row = 0; Row <int(m_CameraItemList.size()); Row++)
  528. {
  529. //set a iter to get the CameraItem
  530. std::list<CameraItem>::iterator Iter = Group->CameraItemGroup.begin();
  531. //Calculate the Current Stitching Rect
  532. int nListSize = int((Group++)->CameraItemGroup.size());
  533. if (nListSize < 2)
  534. continue;
  535. for (int i = 0; i < nListSize; i++)
  536. {
  537. if ((*Iter).pIntersectInstance == NULL)
  538. continue;
  539. //Use quote to get the CameraItem
  540. CameraItem& CameraItem1 = *(Iter);
  541. CameraItem& CameraItem2 = *((*Iter).pIntersectInstance);
  542. //Widen the overlap Rect
  543. MfcLabel::fRect OverlapRect = CameraItem1.IntersectRect;
  544. //扩展窗口
  545. OverlapRect.Left -= 0;
  546. OverlapRect.Right += 0;
  547. /*QRectF CurCameraItemRect(
  548. PANO_IMAGE_BOUNDING_WIDTH + CameraItem1.m_CameraInfo.nHorizonOffset + CameraItem1.m_VideoStreamCatcher.m_nVideoWidth * CameraItem1.nItemIndex,
  549. PANO_IMAGE_BOUNDING_WIDTH + CameraItem1.m_CameraInfo.nVerticalOffset,
  550. CameraItem1.m_VideoStreamCatcher.m_nVideoWidth,
  551. CameraItem1.m_VideoStreamCatcher.m_nVideoHeight
  552. );
  553. QRectF NextCameraItemRect(
  554. PANO_IMAGE_BOUNDING_WIDTH + CameraItem2.m_CameraInfo.nHorizonOffset + CameraItem2.m_VideoStreamCatcher.m_nVideoWidth * CameraItem2.nItemIndex,
  555. PANO_IMAGE_BOUNDING_WIDTH + CameraItem2.m_CameraInfo.nVerticalOffset,
  556. CameraItem2.m_VideoStreamCatcher.m_nVideoWidth,
  557. CameraItem2.m_VideoStreamCatcher.m_nVideoHeight
  558. );*/
  559. QRect InferImageRect = CameraItem1.IntersectRect;
  560. InferImageRect.setLeft(InferImageRect.left() - PANO_IMAGE_BOUNDING_WIDTH - CameraItem1.m_CameraInfo.nHorizonOffset
  561. - CameraItem1.m_VideoStreamCatcher.m_nVideoWidth * CameraItem1.nItemColIndex);
  562. InferImageRect.setTop(InferImageRect.top() - PANO_IMAGE_BOUNDING_WIDTH - CameraItem1.m_CameraInfo.nVerticalOffset);
  563. InferImageRect.setWidth(CameraItem1.IntersectRect.width());
  564. InferImageRect.setHeight(CameraItem1.IntersectRect.height());
  565. QRect TargetImageRect = CameraItem2.PreIntersectRect;
  566. TargetImageRect.setLeft(TargetImageRect.left() - PANO_IMAGE_BOUNDING_WIDTH - CameraItem2.m_CameraInfo.nHorizonOffset
  567. - CameraItem2.m_VideoStreamCatcher.m_nVideoWidth * CameraItem2.nItemColIndex);
  568. TargetImageRect.setTop(TargetImageRect.top() - PANO_IMAGE_BOUNDING_WIDTH - CameraItem2.m_CameraInfo.nVerticalOffset);
  569. TargetImageRect.setWidth(CameraItem2.PreIntersectRect.width());
  570. TargetImageRect.setHeight(CameraItem2.PreIntersectRect.height());
  571. if (m_StitchingTailor.bUseYUV)
  572. {
  573. m_ImageFusion.FusionImageByBlendingGradientYUVByGpu(
  574. m_pPanoImageBufferGPU,
  575. cv::Rect(OverlapRect.Left, OverlapRect.Top, OverlapRect.Width(), OverlapRect.Height()),
  576. CameraItem1.m_CurrentGpuData.pData, CameraItem1.m_CurrentGpuData.nWidth, CameraItem1.m_CurrentGpuData.nHeight, CameraItem1.m_CurrentGpuData.nPitch,
  577. cv::Rect(InferImageRect.x(), InferImageRect.y(), InferImageRect.width(), InferImageRect.height()),
  578. CameraItem2.m_CurrentGpuData.pData, CameraItem2.m_CurrentGpuData.nWidth, CameraItem2.m_CurrentGpuData.nHeight, CameraItem2.m_CurrentGpuData.nPitch,
  579. cv::Rect(TargetImageRect.x(), TargetImageRect.y(), CameraItem2.PreIntersectRect.width(), CameraItem2.PreIntersectRect.height())
  580. );
  581. }
  582. else {
  583. m_ImageFusion.FusionImageByBlendingGradient(
  584. m_pPanoImageBuffer,
  585. cv::Rect(OverlapRect.Left, OverlapRect.Top, OverlapRect.Width(), OverlapRect.Height()),
  586. CameraItem1.m_CurrentFrame,
  587. cv::Rect(InferImageRect.x(), InferImageRect.y(), InferImageRect.width(), InferImageRect.height()),
  588. CameraItem2.m_CurrentFrame,
  589. cv::Rect(TargetImageRect.x(), TargetImageRect.y(), CameraItem2.PreIntersectRect.width(), CameraItem2.PreIntersectRect.height()));
  590. }
  591. Iter++;
  592. }
  593. }
  594. }
  595. void QtCameraHardWareCopilot::MeanWeightBalanceImage()
  596. {
  597. //first to get the panoImage size
  598. int nPanoWidth = m_nPanoWidth;
  599. int nPanoHeight = m_nPanoHeight;
  600. int nPanoPicth = m_nPanoPitch;
  601. std::list<TAG_CAM_ROW_GROUP>::iterator Iter = m_CameraItemList.begin();
  602. for (int RowIndex = 0; RowIndex < int(m_CameraItemList.size()); RowIndex++)
  603. {
  604. //define a iterator to get the CameraItem
  605. std::list<CameraItem>::iterator IterRow = Iter->CameraItemGroup.begin();
  606. int nListSize = int(Iter->CameraItemGroup.size());
  607. if (nListSize < 2)
  608. continue;
  609. for (int i = 0; i < nListSize; i++)
  610. {
  611. if ((*IterRow).pIntersectInstance == NULL)
  612. continue;
  613. //Use quote to get the CameraItem
  614. CameraItem& CameraItem1 = *(IterRow);
  615. CameraItem& CameraItem2 = *((*IterRow).pIntersectInstance);
  616. //Widen the overlap Rect
  617. MfcLabel::fRect OverlapRect = CameraItem1.IntersectRect;
  618. if (CameraItem1.IntersectRect.isEmpty())
  619. continue;
  620. //扩展窗口
  621. OverlapRect.Left -= 0;
  622. OverlapRect.Right += 0;
  623. QRect InferImageRect = CameraItem1.IntersectRect;
  624. InferImageRect.setLeft(InferImageRect.left() - PANO_IMAGE_BOUNDING_WIDTH - CameraItem1.m_CameraInfo.nHorizonOffset
  625. - CameraItem1.m_VideoStreamCatcher.m_nVideoWidth * CameraItem1.nItemColIndex);
  626. InferImageRect.setTop(InferImageRect.top() - PANO_IMAGE_BOUNDING_WIDTH - CameraItem1.m_CameraInfo.nVerticalOffset);
  627. InferImageRect.setWidth(CameraItem1.IntersectRect.width());
  628. InferImageRect.setHeight(CameraItem1.IntersectRect.height());
  629. QRect TargetImageRect = CameraItem2.PreIntersectRect;
  630. TargetImageRect.setLeft(TargetImageRect.left() - PANO_IMAGE_BOUNDING_WIDTH - CameraItem2.m_CameraInfo.nHorizonOffset
  631. - CameraItem2.m_VideoStreamCatcher.m_nVideoWidth * CameraItem2.nItemColIndex);
  632. TargetImageRect.setTop(TargetImageRect.top() - PANO_IMAGE_BOUNDING_WIDTH - CameraItem2.m_CameraInfo.nVerticalOffset);
  633. TargetImageRect.setWidth(CameraItem2.PreIntersectRect.width());
  634. TargetImageRect.setHeight(CameraItem2.PreIntersectRect.height());
  635. g_CurFrameMutex.lock();
  636. cv::Rect cvInferRc = cv::Rect(InferImageRect.left(), InferImageRect.right(), InferImageRect.width(), InferImageRect.height());
  637. cv::Mat InferCurrentFrameROI = CameraItem1.m_CurrentFrame(cvInferRc);
  638. cv::Rect cvTargetRc = cv::Rect(TargetImageRect.left(), TargetImageRect.right(), TargetImageRect.width(), TargetImageRect.height());
  639. cv::Mat TargetCurrentFrameROI = CameraItem2.m_CurrentFrame(cvTargetRc);
  640. float fParams = 0.5, fMeans = 0.0;
  641. m_ImageColorBalance.InterectRectDiff(TargetCurrentFrameROI, InferCurrentFrameROI, fParams, fMeans);
  642. CameraItem2.m_CurrentFrame = CameraItem2.m_CurrentFrame * fParams;
  643. g_CurFrameMutex.unlock();
  644. Iter++;
  645. }
  646. }
  647. }
  648. void QtCameraHardWareCopilot::CalculateAllItemIntersectRect()
  649. {
  650. //to get the intersect rect of all the CameraItem
  651. //first to get the cameralist size
  652. //this part is calculate the horizontal intersect rect of all the cameraitem
  653. //set a iter to get the TAG... group
  654. std::list<TAG_CAM_ROW_GROUP>::iterator GroupIter = m_CameraItemList.begin();
  655. for (int RowNum = 0; RowNum < int(m_CameraItemList.size()); RowNum++)
  656. {
  657. TAG_CAM_ROW_GROUP& CurGroup = *(GroupIter++);
  658. int nCameraNum = int(CurGroup.CameraItemGroup.size());
  659. if (nCameraNum < 2)
  660. continue;
  661. //then to get the intersect rect of all the CameraItem
  662. std::list<CameraItem>::iterator Iter = (CurGroup.CameraItemGroup.begin());
  663. std::list<CameraItem>::iterator InLoopIter = (CurGroup.CameraItemGroup.begin());
  664. for (int CamNum = 0; CamNum < nCameraNum; CamNum++)
  665. {
  666. if (!Iter->bActive)
  667. continue;
  668. InLoopIter = Iter;
  669. CameraItem* pPreCameraItem = nullptr;
  670. CameraItem* pNextCameraItem = nullptr;
  671. if (Iter != CurGroup.CameraItemGroup.begin())
  672. pPreCameraItem = &(*(--InLoopIter));
  673. CameraItem& CurrentCameraItem = (*(Iter++));
  674. if (Iter != CurGroup.CameraItemGroup.end())
  675. pNextCameraItem = &(*Iter);
  676. //if the current CameraItem is the first one, select the pre one
  677. CurrentCameraItem.nItemColIndex = CamNum;
  678. QRectF CurCameraItemRect(
  679. PANO_IMAGE_BOUNDING_WIDTH + CurrentCameraItem.m_CameraInfo.nHorizonOffset + CurrentCameraItem.m_VideoStreamCatcher.m_nVideoWidth * CurrentCameraItem.nItemColIndex,
  680. PANO_IMAGE_BOUNDING_WIDTH + CurrentCameraItem.m_CameraInfo.nVerticalOffset,
  681. CurrentCameraItem.m_VideoStreamCatcher.m_nVideoWidth,
  682. CurrentCameraItem.m_VideoStreamCatcher.m_nVideoHeight
  683. );
  684. CurrentCameraItem.ImageRect = CurCameraItemRect.toRect();
  685. QRectF NextCameraItemRect;
  686. if (pNextCameraItem != nullptr)
  687. NextCameraItemRect = QRectF(
  688. PANO_IMAGE_BOUNDING_WIDTH + pNextCameraItem->m_CameraInfo.nHorizonOffset + pNextCameraItem->m_VideoStreamCatcher.m_nVideoWidth * pNextCameraItem->nItemColIndex,
  689. PANO_IMAGE_BOUNDING_WIDTH + pNextCameraItem->m_CameraInfo.nVerticalOffset,
  690. pNextCameraItem->m_VideoStreamCatcher.m_nVideoWidth,
  691. pNextCameraItem->m_VideoStreamCatcher.m_nVideoHeight
  692. );
  693. //get the intersect rect
  694. QRectF IntersectRect = CurCameraItemRect.intersected(NextCameraItemRect);
  695. IntersectRect.setLeft(IntersectRect.left());
  696. IntersectRect.setRight(IntersectRect.right());
  697. QRectF PreItemInterRect;
  698. if (pPreCameraItem != nullptr)
  699. PreItemInterRect = pPreCameraItem->IntersectRect;
  700. //get the relative overlap rect
  701. if (IntersectRect.width() == 0 || IntersectRect.height() == 0)
  702. {
  703. CurrentCameraItem.pIntersectInstance = NULL;
  704. }
  705. QRect CurInterRect;
  706. CurInterRect.setTop(//IntersectRect.top() < CurCameraItemRect.top() ?
  707. IntersectRect.top() - CurCameraItemRect.top());
  708. CurInterRect.setLeft(CurCameraItemRect.left() - IntersectRect.left());
  709. CurInterRect.setWidth(IntersectRect.width());
  710. CurInterRect.setHeight(IntersectRect.height());
  711. QRectF PreItemIntersectRectInCurItemCoordinate;
  712. if (PreItemInterRect.width() != 0 || PreItemInterRect.height() != 0)
  713. {
  714. PreItemIntersectRectInCurItemCoordinate.setTop(
  715. //PreItemInterRect.top() < CurCameraItemRect.top() ?
  716. PreItemInterRect.top() - CurCameraItemRect.top());
  717. PreItemIntersectRectInCurItemCoordinate.setLeft(
  718. //PreItemInterRect.left() < CurCameraItemRect.left() ?
  719. PreItemInterRect.left() - CurCameraItemRect.left());
  720. PreItemIntersectRectInCurItemCoordinate.setWidth(PreItemInterRect.width());
  721. PreItemIntersectRectInCurItemCoordinate.setHeight(PreItemInterRect.height());
  722. }
  723. //flag the intersect instance
  724. CurrentCameraItem.pIntersectInstance = pNextCameraItem;
  725. //according to intersect rect to calculate the overlap vector
  726. CurrentCameraItem.m_vvOverlapBounding.resize(CurrentCameraItem.m_VideoStreamCatcher.m_nVideoHeight);
  727. for (int i = 0; i < CurrentCameraItem.m_VideoStreamCatcher.m_nVideoHeight; i++)
  728. {
  729. CurrentCameraItem.m_vvOverlapBounding[i].resize(2);
  730. //judge this line is overlap or not
  731. if (pPreCameraItem != nullptr)
  732. {
  733. if (PreItemIntersectRectInCurItemCoordinate.top() > i || i > PreItemIntersectRectInCurItemCoordinate.bottom())
  734. {
  735. CurrentCameraItem.m_vvOverlapBounding[i][0] = 0;
  736. }
  737. else
  738. {
  739. CurrentCameraItem.m_vvOverlapBounding[i][0] = PreItemIntersectRectInCurItemCoordinate.width();
  740. }
  741. }
  742. else
  743. CurrentCameraItem.m_vvOverlapBounding[i][0] = 0;
  744. if (pNextCameraItem != nullptr)
  745. {
  746. if (CurInterRect.top() > i || i > CurInterRect.bottom())
  747. {
  748. CurrentCameraItem.m_vvOverlapBounding[i][1] = CurCameraItemRect.width();
  749. }
  750. else
  751. {
  752. CurrentCameraItem.m_vvOverlapBounding[i][1] = CurCameraItemRect.width() - CurrentCameraItem.IntersectRect.width();
  753. }
  754. }
  755. else
  756. CurrentCameraItem.m_vvOverlapBounding[i][1] = CurCameraItemRect.width();
  757. }
  758. //todo: after complete the main process this program has to be changed
  759. CurrentCameraItem.IntersectRect = IntersectRect.toRect();
  760. CurrentCameraItem.PreIntersectRect = PreItemInterRect.toRect();
  761. // if (CurrentCameraItem.IntersectRect.left() < 50)
  762. // {
  763. // CurrentCameraItem.IntersectRect.setLeft(50);
  764. // }
  765. }
  766. m_bBlockThread = false;
  767. //calculate the row group max available rect
  768. CalculateHorItemMaxAvailableRect(CurGroup.CameraItemGroup, CurGroup.AvailableRect);
  769. }
  770. if (int(m_CameraItemList.size()) < 2)
  771. return;
  772. //calculate the intersect rect group rect
  773. GroupIter = m_CameraItemList.begin();
  774. for (int GroupIndex = 0; GroupIndex < int(m_CameraItemList.size()); GroupIndex++)
  775. {
  776. TAG_CAM_ROW_GROUP* pPreGroup = nullptr;
  777. TAG_CAM_ROW_GROUP* pNextGroup = nullptr;
  778. if (GroupIter->AvailableRect.Width == 0 || GroupIter->AvailableRect.Height == 0)
  779. continue;
  780. if (GroupIter != m_CameraItemList.begin())
  781. {
  782. pPreGroup = &(*(--GroupIter));
  783. ++GroupIter;
  784. }
  785. TAG_CAM_ROW_GROUP& CurrentCameraGroup = (*(GroupIter++));
  786. if (GroupIter != m_CameraItemList.end())
  787. pNextGroup = &(*GroupIter);
  788. else
  789. continue;
  790. QRectF CurGroupRect (
  791. GroupIter->AvailableRect.Left,
  792. GroupIter->AvailableRect.Top,
  793. GroupIter->AvailableRect.Width,
  794. GroupIter->AvailableRect.Height
  795. );
  796. QRectF NextGroupRect(
  797. pNextGroup->AvailableRect.Left,
  798. pNextGroup->AvailableRect.Top,
  799. pNextGroup->AvailableRect.Width,
  800. pNextGroup->AvailableRect.Height
  801. );
  802. QRectF CurIntersectNextRect = CurGroupRect.intersected(NextGroupRect);
  803. if (CurIntersectNextRect.width() == 0 || CurIntersectNextRect.height() == 0)
  804. {
  805. CurrentCameraGroup.pNextIntersectGroup = nullptr;
  806. continue;
  807. }
  808. else
  809. {
  810. CurrentCameraGroup.pNextIntersectGroup = pNextGroup;
  811. }
  812. QRect CurInterRect;
  813. CurInterRect.setTop(//IntersectRect.top() < CurCameraItemRect.top() ?
  814. CurIntersectNextRect.top() - CurGroupRect.top());
  815. CurInterRect.setLeft(CurIntersectNextRect.left() - CurGroupRect.left());
  816. CurInterRect.setWidth(CurIntersectNextRect.width());
  817. CurInterRect.setHeight(CurIntersectNextRect.height());
  818. CurrentCameraGroup.vvGroupOverlapBounding.resize(CurrentCameraGroup.AvailableRect.Height);
  819. for (int i = 0; i < CurrentCameraGroup.AvailableRect.Height; i++)
  820. {
  821. CurrentCameraGroup.vvGroupOverlapBounding[i].resize(2);
  822. //judge this line is overlap or not
  823. /* if (ppregroup != nullptr)
  824. {
  825. if (PreItemIntersectRectInCurItemCoordinate.top() > i || i > PreItemIntersectRectInCurItemCoordinate.bottom())
  826. {
  827. CurrentCameraGroup.m_vvOverlapBounding[i][0] = 0;
  828. }
  829. else
  830. {
  831. CurrentCameraGroup.m_vvOverlapBounding[i][0] = PreItemIntersectRectInCurItemCoordinate.width();
  832. }
  833. }
  834. else*/
  835. CurrentCameraGroup.vvGroupOverlapBounding[i][0] = 0;
  836. if (CurrentCameraGroup.pNextIntersectGroup != nullptr)
  837. {
  838. if (CurInterRect.top() > i || i > CurInterRect.bottom())
  839. {
  840. CurrentCameraGroup.vvGroupOverlapBounding[i][1] = CurGroupRect.width();
  841. }
  842. else
  843. {
  844. CurrentCameraGroup.vvGroupOverlapBounding[i][1] = 0;
  845. }
  846. }
  847. else
  848. CurrentCameraGroup.vvGroupOverlapBounding[i][1] = CurGroupRect.width();
  849. }
  850. }
  851. }
  852. void QtCameraHardWareCopilot::CalculateAllItemIntersectRectWithOutBlender()
  853. {
  854. //to get the intersect rect of all the CameraItem
  855. //first to get the cameralist size
  856. //this part is calculate the horizontal intersect rect of all the cameraitem
  857. //set a iter to get the TAG... group
  858. std::list<TAG_CAM_ROW_GROUP>::iterator GroupIter = m_CameraItemList.begin();
  859. for (int RowNum = 0; RowNum < int(m_CameraItemList.size()); RowNum++)
  860. {
  861. TAG_CAM_ROW_GROUP& CurGroup = *(GroupIter);
  862. if (GroupIter != (--m_CameraItemList.end()))
  863. GroupIter++;
  864. int nCameraNum = int(CurGroup.CameraItemGroup.size());
  865. if (nCameraNum < 2)
  866. continue;
  867. //then to get the intersect rect of all the CameraItem
  868. std::list<CameraItem>::iterator Iter = (CurGroup.CameraItemGroup.begin());
  869. std::list<CameraItem>::iterator InLoopIter = (CurGroup.CameraItemGroup.begin());
  870. for (int CamNum = 0; CamNum < nCameraNum; CamNum++)
  871. {
  872. if (!Iter->bActive)
  873. continue;
  874. InLoopIter = Iter;
  875. CameraItem* pPreCameraItem = nullptr;
  876. CameraItem* pNextCameraItem = nullptr;
  877. if (Iter != CurGroup.CameraItemGroup.begin())
  878. pPreCameraItem = &(*(--InLoopIter));
  879. CameraItem& CurrentCameraItem = (*(Iter++));
  880. if (Iter != CurGroup.CameraItemGroup.end())
  881. pNextCameraItem = &(*Iter);
  882. //if the current CameraItem is the first one, select the pre one
  883. CurrentCameraItem.nItemColIndex = CamNum;
  884. QRectF CurCameraItemRect(
  885. PANO_IMAGE_BOUNDING_WIDTH + CurrentCameraItem.m_CameraInfo.nHorizonOffset + CurrentCameraItem.m_VideoStreamCatcher.m_nVideoWidth * CurrentCameraItem.nItemColIndex,
  886. PANO_IMAGE_BOUNDING_WIDTH + CurrentCameraItem.m_CameraInfo.nVerticalOffset,
  887. CurrentCameraItem.m_VideoStreamCatcher.m_nVideoWidth,
  888. CurrentCameraItem.m_VideoStreamCatcher.m_nVideoHeight
  889. );
  890. CurrentCameraItem.ImageRect = CurCameraItemRect.toRect();
  891. QRectF NextCameraItemRect;
  892. if (pNextCameraItem != nullptr)
  893. NextCameraItemRect = QRectF(
  894. PANO_IMAGE_BOUNDING_WIDTH + pNextCameraItem->m_CameraInfo.nHorizonOffset + pNextCameraItem->m_VideoStreamCatcher.m_nVideoWidth * pNextCameraItem->nItemColIndex,
  895. PANO_IMAGE_BOUNDING_WIDTH + pNextCameraItem->m_CameraInfo.nVerticalOffset,
  896. pNextCameraItem->m_VideoStreamCatcher.m_nVideoWidth,
  897. pNextCameraItem->m_VideoStreamCatcher.m_nVideoHeight
  898. );
  899. //get the intersect rect
  900. QRectF IntersectRect = CurCameraItemRect.intersected(NextCameraItemRect);
  901. IntersectRect.setLeft(IntersectRect.left());
  902. IntersectRect.setRight(IntersectRect.right());
  903. QRectF PreItemInterRect;
  904. if (pPreCameraItem != nullptr)
  905. PreItemInterRect = pPreCameraItem->IntersectRect;
  906. //get the relative overlap rect
  907. if (IntersectRect.width() == 0 || IntersectRect.height() == 0)
  908. {
  909. CurrentCameraItem.pIntersectInstance = NULL;
  910. }
  911. QRect CurInterRect;
  912. CurInterRect.setTop(//IntersectRect.top() < CurCameraItemRect.top() ?
  913. IntersectRect.top() - CurCameraItemRect.top());
  914. CurInterRect.setLeft(CurCameraItemRect.left() - IntersectRect.left());
  915. CurInterRect.setWidth(IntersectRect.width());
  916. CurInterRect.setHeight(IntersectRect.height());
  917. QRectF PreItemIntersectRectInCurItemCoordinate;
  918. if (PreItemInterRect.width() != 0 || PreItemInterRect.height() != 0)
  919. {
  920. PreItemIntersectRectInCurItemCoordinate.setTop(
  921. //PreItemInterRect.top() < CurCameraItemRect.top() ?
  922. PreItemInterRect.top() - CurCameraItemRect.top());
  923. PreItemIntersectRectInCurItemCoordinate.setLeft(
  924. //PreItemInterRect.left() < CurCameraItemRect.left() ?
  925. PreItemInterRect.left() - CurCameraItemRect.left());
  926. PreItemIntersectRectInCurItemCoordinate.setWidth(PreItemInterRect.width());
  927. PreItemIntersectRectInCurItemCoordinate.setHeight(PreItemInterRect.height());
  928. }
  929. //flag the intersect instance
  930. CurrentCameraItem.pIntersectInstance = pNextCameraItem;
  931. //according to intersect rect to calculate the overlap vector
  932. CurrentCameraItem.m_vvOverlapBounding.resize(CurrentCameraItem.m_VideoStreamCatcher.m_nVideoHeight);
  933. for (int i = 0; i < CurrentCameraItem.m_VideoStreamCatcher.m_nVideoHeight; i++)
  934. {
  935. CurrentCameraItem.m_vvOverlapBounding[i].resize(2);
  936. //judge this line is overlap or not
  937. //if (pPreCameraItem != nullptr)
  938. //{
  939. // if (PreItemIntersectRectInCurItemCoordinate.top() > i || i > PreItemIntersectRectInCurItemCoordinate.bottom())
  940. // {
  941. // CurrentCameraItem.m_vvOverlapBounding[i][0] = 0;
  942. // }
  943. // else
  944. // {
  945. // CurrentCameraItem.m_vvOverlapBounding[i][0] = PreItemIntersectRectInCurItemCoordinate.width();
  946. // }
  947. //}
  948. //else
  949. CurrentCameraItem.m_vvOverlapBounding[i][0] = 0;
  950. if (pNextCameraItem != nullptr)
  951. {
  952. if (CurInterRect.top() > i || i > CurInterRect.bottom())
  953. {
  954. CurrentCameraItem.m_vvOverlapBounding[i][1] = CurCameraItemRect.width();
  955. }
  956. else
  957. {
  958. CurrentCameraItem.m_vvOverlapBounding[i][1] = CurCameraItemRect.width() - CurrentCameraItem.IntersectRect.width();
  959. }
  960. }
  961. else
  962. CurrentCameraItem.m_vvOverlapBounding[i][1] = CurCameraItemRect.width();
  963. }
  964. //todo: after complete the main process this program has to be changed
  965. CurrentCameraItem.IntersectRect = IntersectRect.toRect();
  966. CurrentCameraItem.PreIntersectRect = PreItemInterRect.toRect();
  967. // if (CurrentCameraItem.IntersectRect.left() < 50)
  968. // {
  969. // CurrentCameraItem.IntersectRect.setLeft(50);
  970. // }
  971. }
  972. m_bBlockThread = false;
  973. //calculate the row group max available rect
  974. CalculateHorItemMaxAvailableRect(CurGroup.CameraItemGroup, CurGroup.AvailableRect);
  975. }
  976. if (int(m_CameraItemList.size()) < 2)
  977. return;
  978. //calculate the intersect rect group rect
  979. GroupIter = m_CameraItemList.begin();
  980. for (int GroupIndex = 0; GroupIndex < int(m_CameraItemList.size()); GroupIndex++)
  981. {
  982. TAG_CAM_ROW_GROUP* pPreGroup = nullptr;
  983. TAG_CAM_ROW_GROUP* pNextGroup = nullptr;
  984. if (GroupIter->AvailableRect.Width == 0 || GroupIter->AvailableRect.Height == 0)
  985. continue;
  986. if (GroupIter != m_CameraItemList.begin())
  987. {
  988. pPreGroup = &(*(--GroupIter));
  989. ++GroupIter;
  990. }
  991. TAG_CAM_ROW_GROUP& CurrentCameraGroup = (*(GroupIter++));
  992. if (GroupIter != m_CameraItemList.end())
  993. pNextGroup = &(*GroupIter);
  994. else
  995. continue;
  996. //now we have confirm the current group and the next group
  997. //we have to calculate the intersect rect of item in upper group to lower group
  998. for (auto& Upper : CurrentCameraGroup.CameraItemGroup)
  999. {
  1000. QRectF CurCameraItemRect(
  1001. PANO_IMAGE_BOUNDING_WIDTH + Upper.m_CameraInfo.nHorizonOffset + Upper.m_VideoStreamCatcher.m_nVideoWidth * Upper.nItemColIndex,
  1002. PANO_IMAGE_BOUNDING_WIDTH + Upper.m_VideoStreamCatcher.m_nVideoHeight * Upper.nItemRowIndex + Upper.m_CameraInfo.nVerticalOffset,
  1003. Upper.m_VideoStreamCatcher.m_nVideoWidth,
  1004. Upper.m_VideoStreamCatcher.m_nVideoHeight
  1005. );
  1006. for (auto& lower : pNextGroup->CameraItemGroup)
  1007. {
  1008. QRectF NextCameraItemRect;
  1009. NextCameraItemRect = QRectF(
  1010. PANO_IMAGE_BOUNDING_WIDTH + lower.m_CameraInfo.nHorizonOffset + lower.m_VideoStreamCatcher.m_nVideoWidth * lower.nItemColIndex,
  1011. PANO_IMAGE_BOUNDING_WIDTH + lower.m_VideoStreamCatcher.m_nVideoHeight * lower.nItemRowIndex + lower.m_CameraInfo.nVerticalOffset,
  1012. lower.m_VideoStreamCatcher.m_nVideoWidth,
  1013. lower.m_VideoStreamCatcher.m_nVideoHeight
  1014. );
  1015. QRectF IntersectRect = CurCameraItemRect.intersected(NextCameraItemRect);
  1016. //turn the intersect rect to current item coordinate
  1017. QRectF PreItemIntersectRectInCurItemCoordinate;
  1018. PreItemIntersectRectInCurItemCoordinate.setTop(
  1019. //PreItemInterRect.top() < CurCameraItemRect.top() ?
  1020. IntersectRect.top() - CurCameraItemRect.top());
  1021. PreItemIntersectRectInCurItemCoordinate.setLeft(
  1022. IntersectRect.left() - CurCameraItemRect.left());
  1023. PreItemIntersectRectInCurItemCoordinate.setWidth(IntersectRect.width());
  1024. PreItemIntersectRectInCurItemCoordinate.setHeight(IntersectRect.height());
  1025. //last we have to calculate the overlap vector
  1026. for (int i = 0; i < Upper.m_vvOverlapBounding.size(); i++)
  1027. {
  1028. if(i < PreItemIntersectRectInCurItemCoordinate.top() || i > PreItemIntersectRectInCurItemCoordinate.bottom())
  1029. continue;
  1030. if (Upper.m_vvOverlapBounding[i][0] < PreItemIntersectRectInCurItemCoordinate.left())
  1031. {
  1032. if (Upper.m_vvOverlapBounding[i][1] >= PreItemIntersectRectInCurItemCoordinate.left())
  1033. Upper.m_vvOverlapBounding[i][1] = PreItemIntersectRectInCurItemCoordinate.left();
  1034. else
  1035. Upper.m_vvOverlapBounding[i][1] = Upper.m_vvOverlapBounding[i][0];
  1036. }
  1037. else if (Upper.m_vvOverlapBounding[i][0] >= PreItemIntersectRectInCurItemCoordinate.left())
  1038. {
  1039. if(Upper.m_vvOverlapBounding[i][1] >= PreItemIntersectRectInCurItemCoordinate.right())
  1040. Upper.m_vvOverlapBounding[i][0] = PreItemIntersectRectInCurItemCoordinate.right();
  1041. else
  1042. Upper.m_vvOverlapBounding[i][0] = Upper.m_vvOverlapBounding[i][1];
  1043. }
  1044. //if ()
  1045. // Upper.m_vvOverlapBounding[i][0] = PreItemIntersectRectInCurItemCoordinate.right();
  1046. //if()
  1047. }
  1048. }
  1049. }
  1050. }
  1051. }
  1052. void QtCameraHardWareCopilot::CalculateHorItemMaxAvailableRect(std::list<CameraItem>& RowGroup, MfcLabel::Rect& AvailableRect)
  1053. {
  1054. int nCameraNum = int(RowGroup.size());
  1055. std::list<CameraItem>::iterator Iter = RowGroup.begin();
  1056. AvailableRect.Left = INT_MAX;
  1057. AvailableRect.Top = INT_MIN;
  1058. AvailableRect.Right = INT_MIN;
  1059. AvailableRect.Bottom = INT_MAX;
  1060. for (; Iter != RowGroup.end(); Iter++)
  1061. {
  1062. AvailableRect.Left = MIN(AvailableRect.Left, Iter->ImageRect.left());
  1063. AvailableRect.Right = MAX(AvailableRect.Right, Iter->ImageRect.right());
  1064. AvailableRect.Top = MAX(AvailableRect.Top, Iter->ImageRect.top());
  1065. AvailableRect.Bottom = MIN(AvailableRect.Bottom, Iter->ImageRect.bottom());
  1066. }
  1067. AvailableRect.Width = AvailableRect.Right - AvailableRect.Left;
  1068. AvailableRect.Height = AvailableRect.Bottom - AvailableRect.Top;
  1069. }
  1070. void QtCameraHardWareCopilot::SetConnect()
  1071. {
  1072. //connect the VecInc and VecDec to the slot
  1073. connect(ui.VecIncOffsetButton, &QPushButton::pressed, this, &QtCameraHardWareCopilot::OnVecIncBtnClicked);
  1074. connect(ui.VecDecOffsetButton, &QPushButton::pressed, this, &QtCameraHardWareCopilot::OnVecDecBtnClicked);
  1075. //connect the HorInc and HorDec to the slot
  1076. connect(ui.HorIncOffsetButton, &QPushButton::pressed, this, &QtCameraHardWareCopilot::OnHorIncBtnClicked);
  1077. connect(ui.HorDecOffsetButton, &QPushButton::pressed, this, &QtCameraHardWareCopilot::OnHorDecBtnClicked);
  1078. //connect the Menu to the slot
  1079. connect(ui.menuCamera,&QMenu::triggered, this, &QtCameraHardWareCopilot::OnMenuBtnClicked);
  1080. connect(ui.menuShowMode,&QMenu::triggered, this, &QtCameraHardWareCopilot::OnMenuBtnClicked);
  1081. //connect the CameraQueueScene to the slot
  1082. connect(&m_CameraQueueScene, &CameraModifyScene::CameraItemModified, this, &QtCameraHardWareCopilot::OnCameraItemModified);
  1083. //connect the graphicsView mousepress event to scene mousepress event
  1084. //connect the qtimer to window refresh
  1085. connect(m_pUpdateTimer, &QTimer::timeout, this, &QtCameraHardWareCopilot::RefreshAllSource);
  1086. //connect the INI file to the slot
  1087. connect(ui.INIFilemenu,&QMenu::triggered, this, &QtCameraHardWareCopilot::OnMenuBtnClicked);
  1088. //connect the comboSelectModel to the slot
  1089. connect(ui.comboBoxSelectModel, QOverload<int>::of(&QComboBox::activated), this, &QtCameraHardWareCopilot::OnComboxSelectModel);
  1090. }
  1091. void QtCameraHardWareCopilot::paintEvent(QPaintEvent* event)
  1092. {
  1093. //this;
  1094. ui.PanoramaImglabel->setPixmap(m_PanoPixmap);
  1095. ui.PanoramaImglabel->show();
  1096. }
  1097. void QtCameraHardWareCopilot::OnVecDecBtnClicked()
  1098. {
  1099. //modify the CameraInfo
  1100. m_CameraGripper.MoveVertical(-1);
  1101. //updata the lineedit in mainwindow
  1102. ui.VerticalOffsetEdit->setText(QString::number(m_pCurrentCameraItem->m_CameraInfo.nVerticalOffset));
  1103. //modify the CameraItem
  1104. m_pCurrentCameraItem->setPos(m_pCurrentCameraItem->pos().x(), m_pCurrentCameraItem->pos().y() - 1);
  1105. //emit the signal to CameraQueueScene
  1106. emit m_CameraQueueScene.CameraItemModified();
  1107. }
  1108. void QtCameraHardWareCopilot::OnVecIncBtnClicked()
  1109. {
  1110. //modify the CameraInfo
  1111. m_CameraGripper.MoveVertical(1);
  1112. //updata the lineedit in mainwindow
  1113. ui.VerticalOffsetEdit->setText(QString::number(m_pCurrentCameraItem->m_CameraInfo.nVerticalOffset));
  1114. //modify the CameraItem
  1115. m_pCurrentCameraItem->setPos(m_pCurrentCameraItem->pos().x(), m_pCurrentCameraItem->pos().y() + 1);
  1116. //emit the signal to CameraQueueScene
  1117. emit m_CameraQueueScene.CameraItemModified();
  1118. }
  1119. void QtCameraHardWareCopilot::OnHorDecBtnClicked()
  1120. {
  1121. //modify the CameraInfo
  1122. m_CameraGripper.MoveHorizontal(-1);
  1123. //updata the lineedit in mainwindow
  1124. ui.HorizontalOffsetEdit->setText(QString::number(m_pCurrentCameraItem->m_CameraInfo.nHorizonOffset));
  1125. //modify the CameraItem
  1126. m_pCurrentCameraItem->setPos(m_pCurrentCameraItem->pos().x() - 1, m_pCurrentCameraItem->pos().y());
  1127. //emit the signal to CameraQueueScene
  1128. emit m_CameraQueueScene.CameraItemModified();
  1129. }
  1130. void QtCameraHardWareCopilot::OnHorIncBtnClicked()
  1131. {
  1132. //modify the CameraInfo
  1133. m_CameraGripper.MoveHorizontal(1);
  1134. //updata the lineedit in mainwindow
  1135. ui.HorizontalOffsetEdit->setText(QString::number(m_pCurrentCameraItem->m_CameraInfo.nHorizonOffset));
  1136. //modify the CameraItem
  1137. m_pCurrentCameraItem->setPos(m_pCurrentCameraItem->pos().x() + 1, m_pCurrentCameraItem->pos().y());
  1138. //emit the signal to CameraQueueScene
  1139. emit m_CameraQueueScene.CameraItemModified();
  1140. }
  1141. void QtCameraHardWareCopilot::OnCameraItemModified()
  1142. {
  1143. m_StitchingTailor.Init(m_pPanoImageBuffer, m_nPanoWidth, m_nPanoHeight, cv::Point(0, 0));
  1144. //according to the CameraItem Index to get the CameraInfo
  1145. QList<QGraphicsItem*> pItemList = m_CameraQueueScene.items();
  1146. CameraItem* pItem = nullptr;
  1147. for (auto& iter : pItemList)
  1148. {
  1149. pItem = (CameraItem*)iter;
  1150. if (pItem->bSelected)
  1151. break;
  1152. }
  1153. int nCameraNum = (int)pItemList.size();
  1154. //recalculate the overlap bounding
  1155. //CalculateAllItemIntersectRect();
  1156. m_bBlockThread = true;
  1157. //set the current CameraItem pointer
  1158. m_pCurrentCameraItem = pItem;
  1159. //set the current CameraInfo pointer
  1160. m_pCurrentCameraInfo = &pItem->m_CameraInfo;
  1161. //updata the lineedit in mainwindow
  1162. ui.HorizontalOffsetEdit->SetEditTarget(&pItem->m_CameraInfo.nHorizonOffset);
  1163. ui.HorizontalOffsetEdit->setText(QString::number(pItem->m_CameraInfo.nHorizonOffset));
  1164. ui.VerticalOffsetEdit->SetEditTarget(&pItem->m_CameraInfo.nVerticalOffset);
  1165. ui.VerticalOffsetEdit->setText(QString::number(pItem->m_CameraInfo.nVerticalOffset));
  1166. ui.LightEdit->SetEditTarget(&pItem->m_CameraInfo.nLightOffset);
  1167. ui.LightEdit->setText(QString::number(pItem->m_CameraInfo.nLightOffset));
  1168. ui.CurCameraAddresslabel->setText(pItem->m_CameraInfo.GetCompleteIpAddress());
  1169. m_bBlockThread = false;
  1170. m_CameraQueueScene.update();
  1171. }
  1172. void QtCameraHardWareCopilot::OnMenuBtnClicked(QAction* pAction)
  1173. {
  1174. if (pAction == ui.actionIncCamear)
  1175. {
  1176. ////create a IncCamera
  1177. //IncCamera* pIncCamera = new IncCamera();
  1178. ////set the IncCamera block the main thread
  1179. //pIncCamera->setWindowModality(Qt::ApplicationModal);
  1180. ////Show IncCamera
  1181. //pIncCamera->show();
  1182. ////block the main thread until the IncCamera close
  1183. //while (pIncCamera->isVisible())
  1184. //{
  1185. // QCoreApplication::processEvents();
  1186. //}
  1187. ////if the IncCamera is closed by push the cancel button break the function
  1188. //if (pIncCamera->GetIsOKBtnClicked() != true)
  1189. //{
  1190. // return;
  1191. //}
  1192. ////wait the IncCamera close,get the information from the IncCamera,and push the information to the CameraInfoList
  1193. ////m_CameraItemList.push_back(pIncCamera->GetCameraInfo());
  1194. ////first check the number of the CameraItem
  1195. //int CameraItemNum = m_CameraItemList.size();
  1196. ////create a CameraItem
  1197. //CameraItem* pCameraItem = new CameraItem(nullptr);
  1198. //pCameraItem->m_CameraInfo = pIncCamera->GetCameraInfo();
  1199. ////init the CameraItem
  1200. //if (!pCameraItem->Init(CameraItemNum, QPointF(0, 0)))
  1201. //{
  1202. // //if the CameraItem init failed,delete the CameraItem and return
  1203. // QString Title = "错误";
  1204. // QString Text = "当前输入的链接无法初始化解码器";
  1205. // QMessageBox box;
  1206. // box.setWindowTitle(Title);
  1207. // box.setText(Text);
  1208. // box.addButton(QMessageBox::Cancel);
  1209. // delete pCameraItem;
  1210. // return;
  1211. //}
  1212. ////add the CameraItem to the list
  1213. //m_CameraItemList.push_back(pCameraItem);
  1214. ////add the CameraItem to the scene
  1215. //m_CameraQueueScene.AddCameraItem(pCameraItem);
  1216. ////reset the pano buffer
  1217. ////ResetPanoImageBuffer();
  1218. //m_bCameraItemModified = true;
  1219. ////update the scene
  1220. //m_CameraQueueScene.update();
  1221. ////according to the buffer left top is (0,0),this is dual to(应该是‘影响’才正确) the offset
  1222. //m_StitchingTailor.Init(m_pPanoImageBuffer, m_nPanoWidth, m_nPanoHeight, cv::Point(0, 0));
  1223. ////emit the signal to the CameraItem bas been selected
  1224. //emit m_CameraQueueScene.CameraItemSelected(pCameraItem);
  1225. ////open the thread catch stream
  1226. //pCameraItem->m_VideoStreamCatcher.Start();
  1227. //delete pIncCamera;
  1228. }
  1229. else if (pAction == ui.actionDecCamera)
  1230. {
  1231. }
  1232. else if (pAction == ui.actionCreateDeviceTemplate)
  1233. {
  1234. DeviceTempleteCreator * pDeviceTempleteCreator = new DeviceTempleteCreator(this);
  1235. pDeviceTempleteCreator->m_CameraRowGroupList.swap(m_CameraItemList);
  1236. m_CameraItemList.clear();
  1237. if (pDeviceTempleteCreator->m_CameraRowGroupList.size() == 0)
  1238. {
  1239. TAG_CAM_ROW_GROUP tagCamRowGroup;
  1240. pDeviceTempleteCreator->m_CameraRowGroupList.push_back(tagCamRowGroup);
  1241. }
  1242. pDeviceTempleteCreator->ChangeCurrentGroup(&pDeviceTempleteCreator->m_CameraRowGroupList.back());
  1243. pDeviceTempleteCreator->setWindowModality(Qt::ApplicationModal);
  1244. pDeviceTempleteCreator->SetScene(&m_CameraQueueScene);
  1245. pDeviceTempleteCreator->show();
  1246. while (pDeviceTempleteCreator->isVisible())
  1247. {
  1248. QCoreApplication::processEvents();
  1249. }
  1250. m_CameraItemList.swap(pDeviceTempleteCreator->m_CameraRowGroupList);
  1251. if (pDeviceTempleteCreator->ui.CheckCameraPoseHor->checkState())
  1252. {
  1253. m_fCameraSubStreamToMainStreamHeight = HORIZONTAL_CAMERA_HEIGHT;
  1254. m_fCameraSubStreamToMainStreamHeight = HORIZONTAL_CAMERA_WIDTH;
  1255. }
  1256. if (pDeviceTempleteCreator->ui.CheckCameraPoseVec->checkState())
  1257. {
  1258. m_fCameraSubStreamToMainStreamHeight = VERTICAL_CAMERA_HEIGHT;
  1259. m_fCameraSubStreamToMainStreamWidth = VERTICAL_CAMERA_WIDTH;
  1260. }
  1261. delete pDeviceTempleteCreator;
  1262. }
  1263. else if (pAction == ui.actionFit)
  1264. {
  1265. m_CurShowMode = ShowMode::Fit;
  1266. //sdl init
  1267. {
  1268. //m_SdlProc.Init((void*)ui.PanoramaImglabel->winId(), m_nPanoWidth, m_nPanoHeight, false);
  1269. //m_SdlProc.SetRect(0, 0, ui.PanoramaImglabel->rect().width(), ui.PanoramaImglabel->rect().height());
  1270. }
  1271. }
  1272. else if (pAction == ui.actionFree)
  1273. {
  1274. m_CurShowMode = ShowMode::Free;
  1275. }
  1276. else if (pAction == ui.actionReadINI)
  1277. {
  1278. //use qfiledialog to get the ini file load path
  1279. QString strIniFilePath = QFileDialog::getOpenFileName(this, "选择ini文件", "", "ini文件(*.ini)");
  1280. //if the path is empty return
  1281. if (strIniFilePath.isEmpty())
  1282. return;
  1283. ReadSerializeIniFile(strIniFilePath);
  1284. }
  1285. else if (pAction == ui.actionSAVEINI)
  1286. {
  1287. //use qfiledialog to get the ini file save path
  1288. QString strIniFilePath = QFileDialog::getSaveFileName(this, "选择ini文件", "", "ini文件(*.ini)");
  1289. //if the path is empty return
  1290. if (strIniFilePath.isEmpty())
  1291. return;
  1292. WriteSerializeIniFile(strIniFilePath);
  1293. }
  1294. else if (pAction == ui.DetailParamSetAction)
  1295. {
  1296. //create a DetailParamSet ui
  1297. ParamSetUI *pParamSetUI = new ParamSetUI();
  1298. //set show mode
  1299. //set the IncCamera block the main thread
  1300. pParamSetUI->setWindowModality(Qt::ApplicationModal);
  1301. //Show IncCamera
  1302. pParamSetUI->show();
  1303. //block the main thread until the IncCamera close
  1304. while (pParamSetUI->isVisible())
  1305. {
  1306. QCoreApplication::processEvents();
  1307. }
  1308. m_ParamSet = pParamSetUI->m_ParamSet;
  1309. }
  1310. }
  1311. void QtCameraHardWareCopilot::ResetPanoImageBuffer()
  1312. {
  1313. //reset the Pano IMage buffer
  1314. //first check the item number
  1315. int nCameraNum = 0;
  1316. for (auto& group : m_CameraItemList)
  1317. {
  1318. nCameraNum = MAX(nCameraNum, int(group.CameraItemGroup.size()));
  1319. }
  1320. //QList<QGraphicsItem*> pList = m_CameraQueueScene.items();
  1321. //nCameraNum = int(pList.size());
  1322. //if nCameranum ==0 out
  1323. if (nCameraNum <= 0)
  1324. return;
  1325. //according to this allocate buffer
  1326. //check now panobuffer is null or not
  1327. if (m_pPanoImageBufferGPU != nullptr)
  1328. {
  1329. cudaError Error = cudaFree(m_pPanoImageBufferGPU);
  1330. delete[] m_pPanoImageBuffer;
  1331. m_pPanoImageBuffer = nullptr;
  1332. }
  1333. CameraItem* pFirstItem =(CameraItem*)&(m_CameraItemList.front().CameraItemGroup.front());
  1334. int nCurFrameImageWidth = pFirstItem->m_VideoStreamCatcher.m_nOutputImageWidth;
  1335. int nCurFrameImageHeight = pFirstItem->m_VideoStreamCatcher.m_nOutputImageHeight;
  1336. int nCurFrameImagePitch;
  1337. if (m_StitchingTailor.bUseYUV)
  1338. {
  1339. nCurFrameImagePitch = ((nCurFrameImageWidth * nCameraNum + PANO_IMAGE_BOUNDING_WIDTH * 2)*3 + 3) / 4 * 4;
  1340. //由于yuv图像的特殊性,所以这里需要对长度和宽度做出修正对齐,保证最终的图像能够显示
  1341. nCurFrameImageHeight = ((nCurFrameImageHeight * int(m_CameraItemList.size()) + PANO_IMAGE_BOUNDING_WIDTH * 2 + 1) / 2) * 2;
  1342. m_pPanoImageBuffer = new unsigned char[nCurFrameImagePitch * (nCurFrameImageHeight) * 3 / 2];
  1343. unsigned char* GpuBUffer = nullptr;
  1344. cudaError Error = cudaMalloc(&GpuBUffer, nCurFrameImagePitch * (nCurFrameImageHeight) * 3 / 2);
  1345. m_pPanoImageBufferGPU = GpuBUffer;
  1346. }
  1347. else
  1348. {
  1349. nCurFrameImagePitch = ((nCurFrameImageWidth * nCameraNum + PANO_IMAGE_BOUNDING_WIDTH * 2) * 3 + 3) / 4 * 4;
  1350. nCurFrameImageHeight = (nCurFrameImageHeight * int(m_CameraItemList.size()) + PANO_IMAGE_BOUNDING_WIDTH * 2 + 1) / 2 * 2;
  1351. m_pPanoImageBuffer = new unsigned char[nCurFrameImagePitch * (nCurFrameImageHeight)];
  1352. }
  1353. m_nPanoWidth = nCurFrameImageWidth * nCameraNum + PANO_IMAGE_BOUNDING_WIDTH * 2;
  1354. m_nPanoHeight = nCurFrameImageHeight;
  1355. m_nPanoPitch = nCurFrameImagePitch;
  1356. m_StitchingTailor.nPanoPitch = nCurFrameImagePitch;
  1357. m_bCameraItemModified = false;
  1358. }
  1359. void QtCameraHardWareCopilot::RefreshAllSource()
  1360. {
  1361. //if (!m_bReFreshPrepared)
  1362. // return;
  1363. if (!m_bBlockThread && !m_bCameraItemModified)
  1364. {
  1365. //use Qt to display the image
  1366. // create a QImage to show the unsigned char data
  1367. m_PanoImage = QImage(m_pPanoImageBuffer, m_nPanoWidth, m_nPanoHeight, QImage::Format_BGR888);
  1368. m_PanoPixmap = QPixmap::fromImage(m_PanoImage);
  1369. m_PanoPainter.SetYUVShowOrNot(false);
  1370. m_PanoPainter.SetOrginImage(&m_PanoImage);
  1371. m_PanoPainter.SetLabelRect(ui.PanoramaImglabel->rect());
  1372. m_PanoPainter.EditScaleOrNot = true;
  1373. m_PanoPainter.ImgRect = m_PanoImage.rect();
  1374. m_PanoPainter.ShowClientRect = ui.PanoramaImglabel->rect();
  1375. m_PanoPainter.Draw(m_CurShowMode);
  1376. ////use sdl to display the image
  1377. //{
  1378. // //if Show Mode is fit , init is in select func not here
  1379. //if (m_CurShowMode == ShowMode::Fit)
  1380. //{
  1381. // QByteArray QYuvImage(m_nPanoPitch * m_nPanoHeight * 1.5, 0);
  1382. // memcpy(QYuvImage.data(), m_pPanoImageBuffer, m_nPanoPitch * m_nPanoHeight * 1.5);
  1383. // m_PanoPainter.SetOrginImage(&QYuvImage, m_nPanoWidth, m_nPanoHeight);
  1384. // m_PanoPainter.SetYUVShowOrNot(true);
  1385. // m_PanoPainter.SetLabelRect(ui.PanoramaImglabel->rect());
  1386. // m_PanoPainter.Draw(ShowMode::Fit);
  1387. // /* cudaMemcpy(m_pPanoImageBuffer, m_pPanoImageBufferGPU, m_nPanoPitch * m_nPanoHeight * 1.5, cudaMemcpyDeviceToHost);
  1388. // cv::Mat PanoImage(m_nPanoHeight * 3 / 2, m_nPanoWidth, CV_8UC1, m_pPanoImageBuffer);
  1389. // m_SdlProc.DisplayFrame(m_pPanoImageBuffer, m_nPanoWidth, m_nPanoHeight);*/
  1390. //}
  1391. //}
  1392. }
  1393. }
  1394. void QtCameraHardWareCopilot::mousePressEvent(QMouseEvent* event)
  1395. {
  1396. m_bMousePressOrNot = true;
  1397. QPoint Pt = event->pos();
  1398. MfcLabel::fRect DetailShowRect, ViewPortRect;
  1399. DetailShowRect = ui.PanoramaImglabel->geometry();
  1400. if (DetailShowRect.JudgePtInRectBoxOrNot(fPoint(Pt.x(), Pt.y())))
  1401. {
  1402. m_PreMousePt = Pt;
  1403. }
  1404. }
  1405. void QtCameraHardWareCopilot::mouseMoveEvent(QMouseEvent* event)
  1406. {
  1407. QPoint Pt = event->pos();
  1408. MfcLabel::fRect DetailShowRect, ViewPortRect;// GraphicsRect, GraphicsRect2;
  1409. DetailShowRect = ui.PanoramaImglabel->geometry();
  1410. if (m_bMousePressOrNot && DetailShowRect.JudgePtInRectBoxOrNot(fPoint(Pt.x(), Pt.y())))
  1411. {
  1412. QPoint CurOffset;
  1413. CurOffset.rx() = Pt.x() - m_PreMousePt.x();
  1414. CurOffset.ry() = Pt.y() - m_PreMousePt.y();
  1415. m_PanoPainter.Offset.offset(CurOffset.x(), CurOffset.y());
  1416. m_PreMousePt = Pt;
  1417. }
  1418. }
  1419. void QtCameraHardWareCopilot::mouseReleaseEvent(QMouseEvent* event)
  1420. {
  1421. m_bMousePressOrNot = false;
  1422. m_PreMousePt.setX(0);
  1423. m_PreMousePt.setY(0);
  1424. }
  1425. void QtCameraHardWareCopilot::wheelEvent(QWheelEvent* event)
  1426. {
  1427. QPoint Pt = event->pos();
  1428. MfcLabel::fRect DetailShowRect, ViewPortRect;// GraphicsRect, GraphicsRect2;
  1429. DetailShowRect = ui.PanoramaImglabel->geometry();
  1430. if (DetailShowRect.JudgePtInRectBoxOrNot(fPoint(Pt.x(), Pt.y())))
  1431. {
  1432. DetailShowRect = ui.PanoramaImglabel->geometry();
  1433. Pt.rx() = Pt.x() - DetailShowRect.Left;
  1434. Pt.ry() = Pt.y() - DetailShowRect.Top;
  1435. if (event->delta() > 0)
  1436. {
  1437. m_PanoPainter.CalculateWheelZoomOffsetAndScale(Pt, true, NULL);
  1438. }
  1439. else
  1440. {
  1441. m_PanoPainter.CalculateWheelZoomOffsetAndScale(Pt, false, NULL);
  1442. }
  1443. }
  1444. }
  1445. void QtCameraHardWareCopilot::OnComboxSelectModel(int index)
  1446. {
  1447. if (m_CameraItemList.size() == 0)
  1448. {
  1449. QMessageBox Warning;
  1450. Warning.setText("Please add camera item first!");
  1451. //Warning.exec();
  1452. return;
  1453. }
  1454. //if the index is 0, it means the current model is single item to modify
  1455. if (index == 0)
  1456. {
  1457. m_bCameraItemMoveModel = true;
  1458. emit m_CameraQueueScene.CameraItemModified();
  1459. m_CameraGripper.EmptyMagazine();
  1460. m_CameraGripper.fillingGripper(m_pCurrentCameraItem);
  1461. }
  1462. else
  1463. {
  1464. m_bCameraItemMoveModel = false;
  1465. emit m_CameraQueueScene.CameraItemModified();
  1466. m_CameraGripper.EmptyMagazine();
  1467. int nCurGroupRowIndex = m_pCurrentCameraItem->nItemRowIndex;
  1468. std::list<TAG_CAM_ROW_GROUP>::iterator Group = m_CameraItemList.begin();
  1469. for (; Group->nRowCameraIndex != nCurGroupRowIndex; Group++);
  1470. for (auto& item : Group->CameraItemGroup)
  1471. m_CameraGripper.fillingGripper(&(item));
  1472. }
  1473. m_CameraQueueScene.SetSelectModel(index==0?true:false);
  1474. }
  1475. void QtCameraHardWareCopilot::closeEvent(QCloseEvent* event)
  1476. {
  1477. s_bSwitchProcess = false;
  1478. }
  1479. void QtCameraHardWareCopilot::ReadSerializeIniFile(QString strfilepath)
  1480. {
  1481. //open file
  1482. QFile file(strfilepath);
  1483. if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
  1484. {
  1485. QMessageBox::warning(this, tr("Read File"), tr("Cannot open file:\n%1").arg(strfilepath));
  1486. return;
  1487. }
  1488. //use QDataStream to read the file
  1489. QDataStream in(&file);
  1490. //read the data
  1491. int nItemRowNum = 0;
  1492. in >> nItemRowNum;
  1493. for (int i = 0; i < nItemRowNum; i++)
  1494. {
  1495. int nCurrentItemGroupNum = 0;
  1496. in >> nCurrentItemGroupNum;
  1497. m_CameraItemList.push_back(TAG_CAM_ROW_GROUP());
  1498. TAG_CAM_ROW_GROUP& CurrentRowGroup = m_CameraItemList.back();
  1499. CurrentRowGroup.nRowCameraCount = nCurrentItemGroupNum;
  1500. m_CameraItemList.back().nRowCameraIndex = i;
  1501. CurrentRowGroup.CameraItemGroup.resize(nCurrentItemGroupNum);
  1502. std::list<CameraItem>::iterator it = CurrentRowGroup.CameraItemGroup.begin();
  1503. for (int j = 0; j < nCurrentItemGroupNum; j++)
  1504. {
  1505. CameraItem* pCameraItem = &(*it);
  1506. pCameraItem->nItemRowIndex = i;
  1507. SerializeCameraInfo(in, &pCameraItem->m_CameraInfo, false);
  1508. pCameraItem->m_CameraInfo.nStreamType = 1;
  1509. //init the CameraItem
  1510. if (!pCameraItem->Init(i, QPointF(0, 0)))
  1511. {
  1512. //if the CameraItem init failed,delete the CameraItem and return
  1513. QString Title = "错误";
  1514. QString Text = "the input curl cant init the decoder";
  1515. QMessageBox box;
  1516. box.setWindowTitle(Title);
  1517. box.setText(Text);
  1518. box.addButton(QMessageBox::Cancel);
  1519. box.exec();
  1520. return;
  1521. }
  1522. //add the CameraItem to the scene
  1523. m_CameraQueueScene.AddCameraItem(pCameraItem);
  1524. //update the scene
  1525. m_CameraQueueScene.update();
  1526. //reset the pano buffer
  1527. //ResetPanoImageBuffer();
  1528. m_bCameraItemModified = true;
  1529. //according to the buffer left top is (0,0),this is dual to(应该是‘影响’才正确) the offset
  1530. m_StitchingTailor.Init(m_pPanoImageBuffer, m_nPanoWidth, m_nPanoHeight, cv::Point(0, 0));
  1531. //emit the signal to the CameraItem bas been selected
  1532. emit m_CameraQueueScene.CameraItemModified();
  1533. //open the thread catch stream
  1534. pCameraItem->m_VideoStreamCatcher.Start();
  1535. //get the next CameraItem
  1536. it++;
  1537. }
  1538. }
  1539. }
  1540. void QtCameraHardWareCopilot::WriteSerializeIniFile(QString strfilepath)
  1541. {
  1542. QFile file(strfilepath);
  1543. if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
  1544. {
  1545. QMessageBox::warning(this, tr("Read File"), tr("Cannot open file:\n%1").arg(strfilepath));
  1546. return;
  1547. }
  1548. //use QDataStream to read the file
  1549. QDataStream out(&file);
  1550. //read the data
  1551. int nRowNum = m_CameraItemList.size();
  1552. //set a iter to the list
  1553. std::list<TAG_CAM_ROW_GROUP>::iterator iter = m_CameraItemList.begin();
  1554. //first write the row num
  1555. out << nRowNum;
  1556. for (int i = 0; i < nRowNum; i++)
  1557. {
  1558. int nItemNum = (*iter).CameraItemGroup.size();
  1559. out << nItemNum;
  1560. std::list<CameraItem>::iterator ItemIter = (*iter).CameraItemGroup.begin();
  1561. for (int j = 0; j < nItemNum; j++)
  1562. {
  1563. SerializeCameraInfo(out, &((*ItemIter++).m_CameraInfo), true);
  1564. }
  1565. iter++;
  1566. }
  1567. std::ofstream ofs;
  1568. std::string testString = strfilepath.toStdString();
  1569. testString.copy((char*)testString.c_str(), testString.length() - 4, 0);
  1570. testString = testString + ".dat";
  1571. ofs.open(testString, std::ios::out);
  1572. nlohmann::json Json;
  1573. //ofs << nItemNum;
  1574. iter = m_CameraItemList.begin();
  1575. Json.push_back({
  1576. {"RowNum",nRowNum}
  1577. });
  1578. Json.push_back({
  1579. {"640UpTo4kWidth",m_fCameraSubStreamToMainStreamWidth},
  1580. {"640UpTo4kHeight",m_fCameraSubStreamToMainStreamHeight}
  1581. });
  1582. for (int i = 0; i < nRowNum; i++)
  1583. {
  1584. int nGroupNum = (*iter).CameraItemGroup.size();
  1585. Json.push_back({
  1586. {"ItemNum",nGroupNum }
  1587. });
  1588. std::list<CameraItem>::iterator ItemIter = (*iter).CameraItemGroup.begin();
  1589. for (int j = 0; j < nGroupNum; j++)
  1590. {
  1591. Json.push_back({
  1592. {"IpAddress1",((*ItemIter).m_CameraInfo).szIpAddress1.toStdString()},
  1593. {"IpAddress2",((*ItemIter).m_CameraInfo).szIpAddress2.toStdString()},
  1594. {"IpAddress3",((*ItemIter).m_CameraInfo).szIpAddress3.toStdString()},
  1595. {"IpAddress4",((*ItemIter).m_CameraInfo).szIpAddress4.toStdString()},
  1596. {"UserName",((*ItemIter).m_CameraInfo).szUserName.toStdString()},
  1597. {"Password",((*ItemIter).m_CameraInfo).szPassword.toStdString()},
  1598. {"Port",((*ItemIter).m_CameraInfo).nPort},
  1599. {"StreamType",0},//((*ItemIter).m_CameraInfo).nStreamType},
  1600. {"Channel",((*ItemIter).m_CameraInfo).nChannel},
  1601. {"IsCheckRight",((*ItemIter).m_CameraInfo).bIsCheckRight},
  1602. {"HorizonOffset",((*ItemIter).m_CameraInfo).nHorizonOffset},
  1603. {"VerticalOffset",((*ItemIter).m_CameraInfo).nVerticalOffset},
  1604. {"CameraMatrixColIndex",((*ItemIter)).nItemColIndex},
  1605. {"CameraMatrixRowIndex",(*ItemIter).nItemRowIndex},
  1606. });
  1607. ItemIter++;
  1608. }
  1609. iter++;
  1610. }
  1611. ofs << Json;
  1612. ofs.close();
  1613. }
  1614. void QtCameraHardWareCopilot::SerializeCameraInfo(QDataStream& Stream, CAMERA_INFO* pCameraInfo, bool StoreOrLoad)
  1615. {
  1616. if (StoreOrLoad)
  1617. {
  1618. //store the data
  1619. Stream << pCameraInfo->szIpAddress1;
  1620. Stream << pCameraInfo->szIpAddress2;
  1621. Stream << pCameraInfo->szIpAddress3;
  1622. Stream << pCameraInfo->szIpAddress4;
  1623. Stream << pCameraInfo->szUserName;
  1624. Stream << pCameraInfo->szPassword;
  1625. Stream << pCameraInfo->nPort;
  1626. Stream << pCameraInfo->nStreamType;
  1627. Stream << pCameraInfo->nChannel;
  1628. Stream << pCameraInfo->bIsCheckRight;
  1629. Stream << pCameraInfo->nHorizonOffset;
  1630. Stream << pCameraInfo->nVerticalOffset;
  1631. Stream << pCameraInfo->nColIndex;
  1632. Stream << pCameraInfo->nRowIndex;
  1633. }
  1634. else
  1635. {
  1636. //load the data
  1637. Stream >> pCameraInfo->szIpAddress1;
  1638. Stream >> pCameraInfo->szIpAddress2;
  1639. Stream >> pCameraInfo->szIpAddress3;
  1640. Stream >> pCameraInfo->szIpAddress4;
  1641. Stream >> pCameraInfo->szUserName;
  1642. Stream >> pCameraInfo->szPassword;
  1643. Stream >> pCameraInfo->nPort;
  1644. Stream >> pCameraInfo->nStreamType;
  1645. Stream >> pCameraInfo->nChannel;
  1646. Stream >> pCameraInfo->bIsCheckRight;
  1647. Stream >> pCameraInfo->nHorizonOffset;
  1648. Stream >> pCameraInfo->nVerticalOffset;
  1649. Stream >> pCameraInfo->nColIndex;
  1650. Stream >> pCameraInfo->nRowIndex;
  1651. }
  1652. }