因爱智能

halcon学习笔记(8)——QT显示halcon处理的图像和结果

前面讲过如何配置halcon和QT的联合编程,这次分享一下显示halcon处理后的图像,并输出处理后的结果。

第一步:如前面将的配置halcon的lib一样配置好环境;

第二步:将halcon中调试好的程序导出c++的代码。方法是HDevelop 》文件》导出,然后选择c++的输出,utf-8的格式,确定即可;

第三步:打开导出的c++文档,将内容main函数前面的内容全部复制到qt的要实现内容的.cpp文件里;

第四步:将action函数在QMain实现函数里加入编译即可显示halcon的图像在窗口了;

总结一下:上面四步是简单操作的,那么具体来讲如果你想让halcon的图像显示在你的窗口里,并且可以放置位置和想要的大小,那么就要仔细研究一下halcon导出的源代码了;我的办法是将halcon里的action代码修改复制到QMain实现函数里;action里有一句OpenWindow(0,0,hv_Width/7,hv_Height/7,0,"","",&hv_WindowID);其中0代表是就是窗口ID,写0代表当前系统窗口,如上面四步的结果,halcon处理后的图像并不显示在qt窗口里,而是单独显示在另一个窗口里;所以修改那个0,变为qt当前窗口的winID即可,我的具体代码如下:

头文件内容jdbox1.h

[cpp] view plain copy

  1. #ifndef JDBOX1_H  
  2. #define JDBOX1_H  
  3. #include <QtWidgets/QMainWindow>  
  4. #include "ui_jdbox1.h"  
  5. #include"Halcon.h"  
  6. #include"halconcpp\HalconCpp.h"  
  7.   
  8. using namespace HalconCpp;  
  9.   
  10. class JDBOX1 : public QMainWindow  
  11. {  
  12.     Q_OBJECT  
  13. public:  
  14.     JDBOX1(QWidget *parent = 0);  
  15.     ~JDBOX1();  
  16.      void paintEvent(QPaintEvent *);  
  17.     HalconCpp::HTuple hv_Area, hv_Row, hv_Column, hv_Length, hv_i;//halcon中的参数,我给设为了公共参数,方便传递值    
  18. private:  
  19.     Ui::JDBOX1Class ui;  
  20.   
  21. };  
  22.   
  23. #endif // JDBOX1_H  

实现文件内容jdbox1.cpp,代码不整理,直接源码了,想看的了解一下:

[cpp] view plain copy

  1. #include "jdbox1.h"  
  2. #include <QtWidgets/QApplication>  
  3. #include"Halcon.h"  
  4. #include"halconcpp\HalconCpp.h"  
  5. #include <QPalette>  
  6. #include <QWidget>  
  7. #include <QMessageBox>  
  8. #include <QPainter>  
  9.   
  10.   
  11. using namespace HalconCpp;  
  12.   
  13. // Procedure declarations   
  14. // External procedures   
  15. // Chapter: Graphics / Text  
  16. // Short Description: This procedure displays 'Click 'Run' to continue' in the lower right corner of the screen.  
  17. void disp_continue_message (HTuple hv_WindowHandle, HTuple hv_Color, HTuple hv_Box);  
  18. // Chapter: Graphics / Text  
  19. // Short Description: This procedure writes a text message.  
  20. void disp_message (HTuple hv_WindowHandle, HTuple hv_String, HTuple hv_CoordSystem,   
  21.     HTuple hv_Row, HTuple hv_Column, HTuple hv_Color, HTuple hv_Box);  
  22. // Chapter: Graphics / Text  
  23. // Short Description: Set font independent of OS  
  24. void set_display_font (HTuple hv_WindowHandle, HTuple hv_Size, HTuple hv_Font, HTuple hv_Bold,   
  25.     HTuple hv_Slant);  
  26.   
  27. // Procedures   
  28. // External procedures   
  29. // Chapter: Graphics / Text  
  30. // Short Description: This procedure displays 'Click 'Run' to continue' in the lower right corner of the screen.  
  31. void disp_continue_message (HTuple hv_WindowHandle, HTuple hv_Color, HTuple hv_Box)  
  32. {  
  33.   
  34.   // Local control variables   
  35.   HTuple  hv_ContinueMessage, hv_Row, hv_Column;  
  36.   HTuple  hv_Width, hv_Height, hv_Ascent, hv_Descent, hv_TextWidth;  
  37.   HTuple  hv_TextHeight;  
  38.   
  39.   //This procedure displays 'Press Run (F5) to continue' in the  
  40.   //lower right corner of the screen.  
  41.   //It uses the procedure disp_message.  
  42.   //  
  43.   //Input parameters:  
  44.   //WindowHandle: The window, where the text shall be displayed  
  45.   //Color: defines the text color.  
  46.   //   If set to '' or 'auto', the currently set color is used.  
  47.   //Box: If set to 'true', the text is displayed in a box.  
  48.   //  
  49.   hv_ContinueMessage = "Press Run (F5) to continue";  
  50.   GetWindowExtents(hv_WindowHandle, &hv_Row, &hv_Column, &hv_Width, &hv_Height);  
  51.   GetStringExtents(hv_WindowHandle, (" "+hv_ContinueMessage)+" ", &hv_Ascent, &hv_Descent,   
  52.       &hv_TextWidth, &hv_TextHeight);  
  53.   disp_message(hv_WindowHandle, hv_ContinueMessage, "window", (hv_Height-hv_TextHeight)-12,   
  54.       (hv_Width-hv_TextWidth)-12, hv_Color, hv_Box);  
  55.   return;  
  56. }  
  57.   
  58. // Chapter: Graphics / Text  
  59. // Short Description: This procedure writes a text message.  
  60. void disp_message (HTuple hv_WindowHandle, HTuple hv_String, HTuple hv_CoordSystem,   
  61.     HTuple hv_Row, HTuple hv_Column, HTuple hv_Color, HTuple hv_Box)  
  62. {  
  63.   
  64.   // Local control variables   
  65.   HTuple  hv_Red, hv_Green, hv_Blue, hv_Row1Part;  
  66.   HTuple  hv_Column1Part, hv_Row2Part, hv_Column2Part, hv_RowWin;  
  67.   HTuple  hv_ColumnWin, hv_WidthWin, hv_HeightWin, hv_MaxAscent;  
  68.   HTuple  hv_MaxDescent, hv_MaxWidth, hv_MaxHeight, hv_R1;  
  69.   HTuple  hv_C1, hv_FactorRow, hv_FactorColumn, hv_Width;  
  70.   HTuple  hv_Index, hv_Ascent, hv_Descent, hv_W, hv_H, hv_FrameHeight;  
  71.   HTuple  hv_FrameWidth, hv_R2, hv_C2, hv_DrawMode, hv_Exception;  
  72.   HTuple  hv_CurrentColor;  
  73.   
  74.   //This procedure displays text in a graphics window.  
  75.   //  
  76.   //Input parameters:  
  77.   //WindowHandle: The WindowHandle of the graphics window, where  
  78.   //   the message should be displayed  
  79.   //String: A tuple of strings containing the text message to be displayed  
  80.   //CoordSystem: If set to 'window', the text position is given  
  81.   //   with respect to the window coordinate system.  
  82.   //   If set to 'image', image coordinates are used.  
  83.   //   (This may be useful in zoomed images.)  
  84.   //Row: The row coordinate of the desired text position  
  85.   //   If set to -1, a default value of 12 is used.  
  86.   //Column: The column coordinate of the desired text position  
  87.   //   If set to -1, a default value of 12 is used.  
  88.   //Color: defines the color of the text as string.  
  89.   //   If set to [], '' or 'auto' the currently set color is used.  
  90.   //   If a tuple of strings is passed, the colors are used cyclically  
  91.   //   for each new textline.  
  92.   //Box: If set to 'true', the text is written within a white box.  
  93.   //  
  94.   //prepare window  
  95.   GetRgb(hv_WindowHandle, &hv_Red, &hv_Green, &hv_Blue);  
  96.   GetPart(hv_WindowHandle, &hv_Row1Part, &hv_Column1Part, &hv_Row2Part, &hv_Column2Part);  
  97.   GetWindowExtents(hv_WindowHandle, &hv_RowWin, &hv_ColumnWin, &hv_WidthWin, &hv_HeightWin);  
  98.   SetPart(hv_WindowHandle, 0, 0, hv_HeightWin-1, hv_WidthWin-1);  
  99.   //  
  100.   //default settings  
  101.   if (0 != (hv_Row==-1))  
  102.   {  
  103.     hv_Row = 12;  
  104.   }  
  105.   if (0 != (hv_Column==-1))  
  106.   {  
  107.     hv_Column = 12;  
  108.   }  
  109.   if (0 != (hv_Color==HTuple()))  
  110.   {  
  111.     hv_Color = "";  
  112.   }  
  113.   //  
  114.   hv_String = ((""+hv_String)+"").TupleSplit("\n");  
  115.   //  
  116.   //Estimate extentions of text depending on font size.  
  117.   GetFontExtents(hv_WindowHandle, &hv_MaxAscent, &hv_MaxDescent, &hv_MaxWidth, &hv_MaxHeight);  
  118.   if (0 != (hv_CoordSystem==HTuple("window")))  
  119.   {  
  120.     hv_R1 = hv_Row;  
  121.     hv_C1 = hv_Column;  
  122.   }  
  123.   else  
  124.   {  
  125.     //transform image to window coordinates  
  126.     hv_FactorRow = (1.*hv_HeightWin)/((hv_Row2Part-hv_Row1Part)+1);  
  127.     hv_FactorColumn = (1.*hv_WidthWin)/((hv_Column2Part-hv_Column1Part)+1);  
  128.     hv_R1 = ((hv_Row-hv_Row1Part)+0.5)*hv_FactorRow;  
  129.     hv_C1 = ((hv_Column-hv_Column1Part)+0.5)*hv_FactorColumn;  
  130.   }  
  131.   //  
  132.   //display text box depending on text size  
  133.   if (0 != (hv_Box==HTuple("true")))  
  134.   {  
  135.     //calculate box extents  
  136.     hv_String = (" "+hv_String)+" ";  
  137.     hv_Width = HTuple();  
  138.     HTuple end_val57 = (hv_String.TupleLength())-1;  
  139.     HTuple step_val57 = 1;  
  140.     for (hv_Index=0; hv_Index.Continue(end_val57, step_val57); hv_Index += step_val57)  
  141.     {  
  142.       GetStringExtents(hv_WindowHandle, HTuple(hv_String[hv_Index]), &hv_Ascent,   
  143.           &hv_Descent, &hv_W, &hv_H);  
  144.       hv_Width = hv_Width.TupleConcat(hv_W);  
  145.     }  
  146.     hv_FrameHeight = hv_MaxHeight*(hv_String.TupleLength());  
  147.     hv_FrameWidth = (HTuple(0).TupleConcat(hv_Width)).TupleMax();  
  148.     hv_R2 = hv_R1+hv_FrameHeight;  
  149.     hv_C2 = hv_C1+hv_FrameWidth;  
  150.     //display rectangles  
  151.     GetDraw(hv_WindowHandle, &hv_DrawMode);  
  152.     SetDraw(hv_WindowHandle, "fill");  
  153.     SetColor(hv_WindowHandle, "light gray");  
  154.     DispRectangle1(hv_WindowHandle, hv_R1+3, hv_C1+3, hv_R2+3, hv_C2+3);  
  155.     SetColor(hv_WindowHandle, "white");  
  156.     DispRectangle1(hv_WindowHandle, hv_R1, hv_C1, hv_R2, hv_C2);  
  157.     SetDraw(hv_WindowHandle, hv_DrawMode);  
  158.   }  
  159.   else if (0 != (hv_Box!=HTuple("false")))  
  160.   {  
  161.     hv_Exception = "Wrong value of control parameter Box";  
  162.     throw HalconCpp::HException(hv_Exception);  
  163.   }  
  164.   //Write text.  
  165.   HTuple end_val78 = (hv_String.TupleLength())-1;  
  166.   HTuple step_val78 = 1;  
  167.   for (hv_Index=0; hv_Index.Continue(end_val78, step_val78); hv_Index += step_val78)  
  168.   {  
  169.     hv_CurrentColor = ((const HTuple&)hv_Color)[hv_Index%(hv_Color.TupleLength())];  
  170.     if (0 != (HTuple(hv_CurrentColor!=HTuple("")).TupleAnd(hv_CurrentColor!=HTuple("auto"))))  
  171.     {  
  172.       SetColor(hv_WindowHandle, hv_CurrentColor);  
  173.     }  
  174.     else  
  175.     {  
  176.       SetRgb(hv_WindowHandle, hv_Red, hv_Green, hv_Blue);  
  177.     }  
  178.     hv_Row = hv_R1+(hv_MaxHeight*hv_Index);  
  179.     SetTposition(hv_WindowHandle, hv_Row, hv_C1);  
  180.     WriteString(hv_WindowHandle, HTuple(hv_String[hv_Index]));  
  181.   }  
  182.   //reset changed window settings  
  183.   SetRgb(hv_WindowHandle, hv_Red, hv_Green, hv_Blue);  
  184.   SetPart(hv_WindowHandle, hv_Row1Part, hv_Column1Part, hv_Row2Part, hv_Column2Part);  
  185.   return;  
  186. }  
  187.   
  188. // Chapter: Graphics / Text  
  189. // Short Description: Set font independent of OS  
  190. void set_display_font (HTuple hv_WindowHandle, HTuple hv_Size, HTuple hv_Font, HTuple hv_Bold,   
  191.     HTuple hv_Slant)  
  192. {  
  193.   
  194.   // Local control variables   
  195.   HTuple  hv_OS, hv_PreferenceValue, hv_Exception;  
  196.   HTuple  hv_BoldString, hv_SlantString, hv_AllowedFontSizes;  
  197.   HTuple  hv_Distances, hv_Indices, hv_Fonts, hv_FontSelRegexp;  
  198.   HTuple  hv_FontsCourier;  
  199.   
  200.   //This procedure sets the text font of the current window with  
  201.   //the specified attributes.  
  202.   //It is assumed that following fonts are installed on the system:  
  203.   //Windows: Courier New, Arial Times New Roman  
  204.   //Mac OS X: CourierNewPS, Arial, TimesNewRomanPS  
  205.   //Linux: courier, helvetica, times  
  206.   //Because fonts are displayed smaller on Linux than on Windows,  
  207.   //a scaling factor of 1.25 is used the get comparable results.  
  208.   //For Linux, only a limited number of font sizes is supported,  
  209.   //to get comparable results, it is recommended to use one of the  
  210.   //following sizes: 9, 11, 14, 16, 20, 27  
  211.   //(which will be mapped internally on Linux systems to 11, 14, 17, 20, 25, 34)  
  212.   //  
  213.   //Input parameters:  
  214.   //WindowHandle: The graphics window for which the font will be set  
  215.   //Size: The font size. If Size=-1, the default of 16 is used.  
  216.   //Bold: If set to 'true', a bold font is used  
  217.   //Slant: If set to 'true', a slanted font is used  
  218.   //  
  219.   GetSystem("operating_system", &hv_OS);  
  220.   // dev_get_preferences(...); only in hdevelop  
  221.   // dev_set_preferences(...); only in hdevelop  
  222.   if (0 != (HTuple(hv_Size==HTuple()).TupleOr(hv_Size==-1)))  
  223.   {  
  224.     hv_Size = 16;  
  225.   }  
  226.   if (0 != ((hv_OS.TupleSubstr(0,2))==HTuple("Win")))  
  227.   {  
  228.     //Set font on Windows systems  
  229.     if (0 != (HTuple(HTuple(hv_Font==HTuple("mono")).TupleOr(hv_Font==HTuple("Courier"))).TupleOr(hv_Font==HTuple("courier"))))  
  230.     {  
  231.       hv_Font = "Courier New";  
  232.     }  
  233.     else if (0 != (hv_Font==HTuple("sans")))  
  234.     {  
  235.       hv_Font = "Arial";  
  236.     }  
  237.     else if (0 != (hv_Font==HTuple("serif")))  
  238.     {  
  239.       hv_Font = "Times New Roman";  
  240.     }  
  241.     if (0 != (hv_Bold==HTuple("true")))  
  242.     {  
  243.       hv_Bold = 1;  
  244.     }  
  245.     else if (0 != (hv_Bold==HTuple("false")))  
  246.     {  
  247.       hv_Bold = 0;  
  248.     }  
  249.     else  
  250.     {  
  251.       hv_Exception = "Wrong value of control parameter Bold";  
  252.       throw HalconCpp::HException(hv_Exception);  
  253.     }  
  254.     if (0 != (hv_Slant==HTuple("true")))  
  255.     {  
  256.       hv_Slant = 1;  
  257.     }  
  258.     else if (0 != (hv_Slant==HTuple("false")))  
  259.     {  
  260.       hv_Slant = 0;  
  261.     }  
  262.     else  
  263.     {  
  264.       hv_Exception = "Wrong value of control parameter Slant";  
  265.       throw HalconCpp::HException(hv_Exception);  
  266.     }  
  267.     try  
  268.     {  
  269.       SetFont(hv_WindowHandle, ((((((("-"+hv_Font)+"-")+hv_Size)+"-*-")+hv_Slant)+"-*-*-")+hv_Bold)+"-");  
  270.     }  
  271.     // catch (Exception)   
  272.     catch (HalconCpp::HException &HDevExpDefaultException)  
  273.     {  
  274.       HDevExpDefaultException.ToHTuple(&hv_Exception);  
  275.       //throw (Exception)  
  276.     }  
  277.   }  
  278.   else if (0 != ((hv_OS.TupleSubstr(0,2))==HTuple("Dar")))  
  279.   {  
  280.     //Set font on Mac OS X systems  
  281.     if (0 != (hv_Bold==HTuple("true")))  
  282.     {  
  283.       hv_BoldString = "Bold";  
  284.     }  
  285.     else if (0 != (hv_Bold==HTuple("false")))  
  286.     {  
  287.       hv_BoldString = "";  
  288.     }  
  289.     else  
  290.     {  
  291.       hv_Exception = "Wrong value of control parameter Bold";  
  292.       throw HalconCpp::HException(hv_Exception);  
  293.     }  
  294.     if (0 != (hv_Slant==HTuple("true")))  
  295.     {  
  296.       hv_SlantString = "Italic";  
  297.     }  
  298.     else if (0 != (hv_Slant==HTuple("false")))  
  299.     {  
  300.       hv_SlantString = "";  
  301.     }  
  302.     else  
  303.     {  
  304.       hv_Exception = "Wrong value of control parameter Slant";  
  305.       throw HalconCpp::HException(hv_Exception);  
  306.     }  
  307.     if (0 != (HTuple(HTuple(hv_Font==HTuple("mono")).TupleOr(hv_Font==HTuple("Courier"))).TupleOr(hv_Font==HTuple("courier"))))  
  308.     {  
  309.       hv_Font = "CourierNewPS";  
  310.     }  
  311.     else if (0 != (hv_Font==HTuple("sans")))  
  312.     {  
  313.       hv_Font = "Arial";  
  314.     }  
  315.     else if (0 != (hv_Font==HTuple("serif")))  
  316.     {  
  317.       hv_Font = "TimesNewRomanPS";  
  318.     }  
  319.     if (0 != (HTuple(hv_Bold==HTuple("true")).TupleOr(hv_Slant==HTuple("true"))))  
  320.     {  
  321.       hv_Font = ((hv_Font+"-")+hv_BoldString)+hv_SlantString;  
  322.     }  
  323.     hv_Font += HTuple("MT");  
  324.     try  
  325.     {  
  326.       SetFont(hv_WindowHandle, (hv_Font+"-")+hv_Size);  
  327.     }  
  328.     // catch (Exception)   
  329.     catch (HalconCpp::HException &HDevExpDefaultException)  
  330.     {  
  331.       HDevExpDefaultException.ToHTuple(&hv_Exception);  
  332.       //throw (Exception)  
  333.     }  
  334.   }  
  335.   else  
  336.   {  
  337.     //Set font for UNIX systems  
  338.     hv_Size = hv_Size*1.25;  
  339.     hv_AllowedFontSizes.Clear();  
  340.     hv_AllowedFontSizes[0] = 11;  
  341.     hv_AllowedFontSizes[1] = 14;  
  342.     hv_AllowedFontSizes[2] = 17;  
  343.     hv_AllowedFontSizes[3] = 20;  
  344.     hv_AllowedFontSizes[4] = 25;  
  345.     hv_AllowedFontSizes[5] = 34;  
  346.     if (0 != ((hv_AllowedFontSizes.TupleFind(hv_Size))==-1))  
  347.     {  
  348.       hv_Distances = (hv_AllowedFontSizes-hv_Size).TupleAbs();  
  349.       TupleSortIndex(hv_Distances, &hv_Indices);  
  350.       hv_Size = ((const HTuple&)hv_AllowedFontSizes)[HTuple(hv_Indices[0])];  
  351.     }  
  352.     if (0 != (HTuple(hv_Font==HTuple("mono")).TupleOr(hv_Font==HTuple("Courier"))))  
  353.     {  
  354.       hv_Font = "courier";  
  355.     }  
  356.     else if (0 != (hv_Font==HTuple("sans")))  
  357.     {  
  358.       hv_Font = "helvetica";  
  359.     }  
  360.     else if (0 != (hv_Font==HTuple("serif")))  
  361.     {  
  362.       hv_Font = "times";  
  363.     }  
  364.     if (0 != (hv_Bold==HTuple("true")))  
  365.     {  
  366.       hv_Bold = "bold";  
  367.     }  
  368.     else if (0 != (hv_Bold==HTuple("false")))  
  369.     {  
  370.       hv_Bold = "medium";  
  371.     }  
  372.     else  
  373.     {  
  374.       hv_Exception = "Wrong value of control parameter Bold";  
  375.       throw HalconCpp::HException(hv_Exception);  
  376.     }  
  377.     if (0 != (hv_Slant==HTuple("true")))  
  378.     {  
  379.       if (0 != (hv_Font==HTuple("times")))  
  380.       {  
  381.         hv_Slant = "i";  
  382.       }  
  383.       else  
  384.       {  
  385.         hv_Slant = "o";  
  386.       }  
  387.     }  
  388.     else if (0 != (hv_Slant==HTuple("false")))  
  389.     {  
  390.       hv_Slant = "r";  
  391.     }  
  392.     else  
  393.     {  
  394.       hv_Exception = "Wrong value of control parameter Slant";  
  395.       throw HalconCpp::HException(hv_Exception);  
  396.     }  
  397.     try  
  398.     {  
  399.       SetFont(hv_WindowHandle, ((((((("-adobe-"+hv_Font)+"-")+hv_Bold)+"-")+hv_Slant)+"-normal-*-")+hv_Size)+"-*-*-*-*-*-*-*");  
  400.     }  
  401.     // catch (Exception)   
  402.     catch (HalconCpp::HException &HDevExpDefaultException)  
  403.     {  
  404.       HDevExpDefaultException.ToHTuple(&hv_Exception);  
  405.       if (0 != (HTuple((hv_OS.TupleSubstr(0,4))==HTuple("Linux")).TupleAnd(hv_Font==HTuple("courier"))))  
  406.       {  
  407.         QueryFont(hv_WindowHandle, &hv_Fonts);  
  408.         hv_FontSelRegexp = (("^-[^-]*-[^-]*[Cc]ourier[^-]*-"+hv_Bold)+"-")+hv_Slant;  
  409.         hv_FontsCourier = (hv_Fonts.TupleRegexpSelect(hv_FontSelRegexp)).TupleRegexpMatch(hv_FontSelRegexp);  
  410.         if (0 != ((hv_FontsCourier.TupleLength())==0))  
  411.         {  
  412.           hv_Exception = "Wrong font name";  
  413.           //throw (Exception)  
  414.         }  
  415.         else  
  416.         {  
  417.           try  
  418.           {  
  419.             SetFont(hv_WindowHandle, ((HTuple(hv_FontsCourier[0])+"-normal-*-")+hv_Size)+"-*-*-*-*-*-*-*");  
  420.           }  
  421.           // catch (Exception)   
  422.           catch (HalconCpp::HException &HDevExpDefaultException)  
  423.           {  
  424.             HDevExpDefaultException.ToHTuple(&hv_Exception);  
  425.             //throw (Exception)  
  426.           }  
  427.         }  
  428.       }  
  429.       //throw (Exception)  
  430.     }  
  431.   }  
  432.   // dev_set_preferences(...); only in hdevelop  
  433.   return;  
  434. }  
  435.   
  436.   
  437.   
  438.   
  439. JDBOX1::JDBOX1(QWidget *parent)  
  440.     : QMainWindow(parent)  
  441. {  
  442.     ui.setupUi(this);  
  443.   
  444.    // Local iconic variables   
  445.   HObject  ho_Image, ho_GrayImage, ho_ImageMean;  
  446.   HObject  ho_ImageGauss, ho_Regions, ho_SelectedRegions2;  
  447.   HObject  ho_ConvexRegions, ho_SelectedRegions1, ho_SelectedRegions;  
  448.   HTuple  hv_Width, hv_Height, hv_WindowID, hv_Phi;  
  449.   
  450.   ReadImage(&ho_Image, "D:/JDBOX5.jpg");  
  451.   GetImageSize(ho_Image, &hv_Width, &hv_Height);  
  452.   if (HDevWindowStack::IsOpen())  
  453.     CloseWindow(HDevWindowStack::Pop());  
  454.   SetWindowAttr("background_color","black");  
  455.   
  456.   
  457.   
  458.     Hlong winID=(Hlong)this->winId();//添加位置qt混合添加段  
  459.     OpenWindow(0,0,hv_Width/7,hv_Height/7,winID,"","",&hv_WindowID);//修改这句 添加winID  
  460.   
  461.   
  462.   
  463.   HDevWindowStack::Push(hv_WindowID);  
  464.   if (HDevWindowStack::IsOpen())  
  465.     DispObj(ho_Image, HDevWindowStack::GetActive());  
  466.   set_display_font(hv_WindowID, 14, "mono", "true", "false");  
  467.   disp_continue_message(hv_WindowID, "black", "true");  
  468.   Rgb1ToGray(ho_Image, &ho_GrayImage);  
  469.   Threshold(ho_GrayImage, &ho_Regions, 130, 238);  
  470.   Connection(ho_Regions, &ho_Regions);  
  471.   SelectShape(ho_Regions, &ho_SelectedRegions2, "area", "and", 506286, 751910);  
  472.   if (HDevWindowStack::IsOpen())  
  473.     SetDraw(HDevWindowStack::GetActive(),"fill");  
  474.   if (HDevWindowStack::IsOpen())  
  475.     SetColored(HDevWindowStack::GetActive(),12);  
  476.   if (HDevWindowStack::IsOpen())  
  477.     DispObj(ho_SelectedRegions2, HDevWindowStack::GetActive());  
  478.   disp_continue_message(hv_WindowID, "black", "true");  
  479.   if (HDevWindowStack::IsOpen())  
  480.     DispObj(ho_Image, HDevWindowStack::GetActive());  
  481.   if (HDevWindowStack::IsOpen())  
  482.     SetColor(HDevWindowStack::GetActive(),"green");  
  483.   if (HDevWindowStack::IsOpen())  
  484.     DispObj(ho_SelectedRegions2, HDevWindowStack::GetActive());  
  485.   OrientationRegion(ho_SelectedRegions2, &hv_Phi);  
  486.   AreaCenter(ho_SelectedRegions2, &hv_Area, &hv_Row, &hv_Column);  
  487.   if (HDevWindowStack::IsOpen())  
  488.     SetLineWidth(HDevWindowStack::GetActive(),3);  
  489.   if (HDevWindowStack::IsOpen())  
  490.     SetDraw(HDevWindowStack::GetActive(),"margin");  
  491.   hv_Length = 200;  
  492.   HTuple end_val38 = (hv_Phi.TupleLength())-1;  
  493.   HTuple step_val38 = 1;  
  494.   for (hv_i=0; hv_i.Continue(end_val38, step_val38); hv_i += step_val38)  
  495.   {  
  496.     if (HDevWindowStack::IsOpen())  
  497.       SetColor(HDevWindowStack::GetActive(),"white");  
  498.     //disp_arrow (WindowID, Row[i], Column[i], Row[i] - Length * sin(Phi[i]), Column[i] + Length * cos(Phi[i]), 4)  
  499.     DispCross(hv_WindowID, HTuple(hv_Row[hv_i]), HTuple(hv_Column[hv_i]), 200, HTuple(hv_Phi[hv_i]));  
  500.     disp_message(hv_WindowID, ((HTuple(hv_Phi[hv_i]).TupleDeg()).TupleString("3.1f"))+" deg",   
  501.         "image", HTuple(hv_Row[hv_i]), HTuple(hv_Column[hv_i])-100, "black", "false");  
  502.   }  
  503.   
  504.   setFixedSize(hv_Height/7+200,hv_Height/7); // 禁止改变窗口大小。  
  505.   
  506. }  
  507.   
  508.   
  509.   
  510. void JDBOX1::paintEvent(QPaintEvent *)  
  511. {  
  512.   
  513.   
  514.   
  515.     QPainter painter(this);  
  516.                // painter.drawLine(0,0,200,300);  
  517.               //   painter.drawEllipse(100,100,50,50);  
  518.               //  painter.setBrush(Qt::red);  
  519.              //    painter.drawRect(120,120,30,30);  
  520.   
  521.   
  522.                 // QPoint p( 500, 500);  
  523.     // 设置字体:微软雅黑、点大小50、斜体  
  524.     //painter.setPen(QColor(0, 160, 230));  
  525.     painter.setPen(QColor(0, 0, 0));  
  526.     QFont font;  
  527.     font.setFamily("Microsoft YaHei");  
  528.     //font.setFamily("simsun");  
  529.     font.setPointSize(10);  
  530.    // font.setItalic(true);  
  531.     painter.setFont(font);  
  532.   
  533.       
  534.       
  535.     painter.drawText(450,20,QString::fromLocal8Bit("图上箱子的坐标及面积:"));  
  536.   
  537.   
  538.     for(int i=0;i<=7;i=i++)  
  539.     {  
  540.             
  541.         QString Xword=QString::fromLocal8Bit("x轴%1: %2").arg(i).arg( QString::number( hv_Row[i].D ()));  
  542.         painter.drawText(450,50+30*i,Xword);  
  543.   
  544.     }  
  545.   
  546.   
  547.     for(int i=0;i<=7;i=i++)  
  548.     {  
  549.             
  550.         QString Xword=QString::fromLocal8Bit("y轴%1: %2").arg(i).arg( QString::number( hv_Column[i].D ()));  
  551.         painter.drawText(550,50+30*i,Xword);  
  552.   
  553.     }  
  554.   
  555.   
  556.     for(int i=0;i<=7;i=i++)  
  557.     {  
  558.             
  559.         QString Xword=QString::fromLocal8Bit("面积%1: %2").arg(i).arg( QString::number( hv_Area[i].D ()));  
  560.         painter.drawText(650,50+30*i,Xword);  
  561.   
  562.     }  
  563. }  
  564.   
  565.   
  566.   
  567. JDBOX1::~JDBOX1()  
  568. {  
  569.   
  570. }  
原图:



处理后的效果图:

评论