VC++联合HALCON多线程处理图像

本文,通过实际代码演示图像的多线程处理,以下为具体的流程。

[plain]  view plain  copy
  1. #define THREAD_CNT 60//定义一个常量,它要比线程的个数还要大  
  2. CEvent eFaceProcThread[THREAD_CNT];  
  3. static UINT FaceProcThread(LPVOID lParam)  
  4. {  
  5.     POUTPUTDATA pParam = (POUTPUTDATA)lParam;  
  6.     //处理图像,这里是基于形状的模板匹配找到对应位置,再把模板仿射到找到的位置保存到ho_RegionAffineTrans  
  7.     PartialRegional(  
  8.         pParam->ho_Image,  
  9.         pParam->ho_ObjectSelected,  
  10.         pParam->ho_RegionUnion,  
  11.         &pParam->ho_RegionAffineTrans,  
  12.         pParam->hv_ModelID);  
  13.     eFaceProcThread[pParam->Index].SetEvent();  
  14.     return 0;  
  15. }  
  16.   
  17. int ResistanceFind(HObject  ho_Image,  
  18.     PINPUTDATA pInputData,POUTPUTDATA pOutputData)  
  19. {  
  20.     // Local iconic variables  
  21.     HObject  ho_RegionErosion, ho_RegionUnion;  
  22.     HObject  ho_ObjectSelected;  
  23.   
  24.     // Local control variables  
  25.     HTuple  hv_Width, hv_Height, hv_WindowHandle;  
  26.     HTuple  hv_Number, hv_ModelID, hv_Area, hv_Row1, hv_Column1;  
  27.   
  28.     BlobDemo(ho_Image, &ho_RegionErosion, &ho_RegionUnion, &hv_Number, &hv_ModelID);  
  29.     AreaCenter(ho_RegionUnion, &hv_Area, &hv_Row1, &hv_Column1);  
  30.     {  
  31.         int end_num = hv_Number;  
  32.   
  33.         OUTPUTDATA stOutputData[THREAD_CNT];//结构体  
  34.           
  35.         for(int i = 0; i < end_num;i++)  
  36.         {  
  37.             //BLOB分析获取单个识别区域  
  38.             SelectObj(ho_RegionErosion, &ho_ObjectSelected, i+1);  
  39.             stOutputData[i].Index = i;//第几个数据  
  40.             stOutputData[i].ho_Image = ho_Image;//原图  
  41.             stOutputData[i].ho_ObjectSelected = ho_ObjectSelected;//单个线程要处理的区域  
  42.             stOutputData[i].ho_RegionUnion = ho_RegionUnion;//模板轮廓,在匹配获得区域后,就可以把模板轮廓仿射盖上去  
  43.             stOutputData[i].hv_ModelID = hv_ModelID;//模板ID  
  44.             GenEmptyObj (&stOutputData[i].ho_EmptyObject);//新建一个空数据  
  45.             //打开线程,由于是循环开线程故这里会是多线程  
  46.             AfxBeginThread(FaceProcThread,&stOutputData[i],THREAD_PRIORITY_IDLE,0,0);  
  47.         }  
  48.         //遍历等待线程实行完成  
  49.         for(int j = 0; j < end_num;j++)  
  50.         {  
  51.             WaitForSingleObject(eFaceProcThread[j].m_hObject,-1);  
  52.         }  
  53.         HObject ho_EmptyObject;  
  54.         GenEmptyObj(&ho_EmptyObject);//新建一个空数据  
  55.         //遍历把各线程找到的区域合并到ho_EmptyObject  
  56.         for(int j = 0; j < end_num;j++)  
  57.         {  
  58.             ConcatObj(ho_EmptyObject, stOutputData[j].ho_RegionAffineTrans, &ho_EmptyObject);  
  59.         }  
  60.         DispObj(ho_EmptyObject, pOutputData->hWndID);//显示通过多线程找到的区域  
  61.     }  
  62.     return 0;  
  63. }  

猜你喜欢

转载自blog.csdn.net/leo_888/article/details/80241534