前提:已经创建好模板所以要读去模板轮廓的最小外接矩形的坐标已经不用再读取一张图片
然而神奇的事情就发生
当不读取图片的时候,最小外接矩形的坐标读取显示为0,如图1
但加入读取图片的算子,就可以读取到模板矩形的最小外接矩形的坐标,运行效果如图2
但觉的真的跟read_image这个算子无关啊~好迷,希望能有大神能够解答问题。
附加调试代码,就注释掉read_image这个算子的结果就有不同。。。。。
这个代码是win32控制台工程文件
- #include <stdio.h>
- #include "HalconCpp.h"
- #include <Windows.h>
- using namespace Halcon;
- #pragma comment(lib, "HalconCpp.lib")
- int main()
- {
- Hobject Image, ModelContours, ContoursAffinTrans;
- Hobject Region1, RegionUnion1;
- // Local control variables
- HTuple ModelID,HomMat2D1;
- HTuple Row, Column, Tuple;
- HTuple Row1, Column1, Row2, Column2;
- set_system("border_shape_models", "false");
- read_image(&Image, "C:/Users/Administrator/Desktop/imgs/1.bmp");
- read_shape_model("C:/Users/Administrator/Desktop/zhujian/1233.shm", &ModelID);
- read_tuple("C:/Users/Administrator/Desktop/imgs/123.tup", &Tuple);
- Row = Tuple[0];
- Column = Tuple[1];
- int X,Y;
- X= Row[0].I();
- Y=Column[0].I();
- printf("模板中心点坐标为:(%d,%d)\n",X,Y);
- //读取模板并把模板仿射变换到原来的位置
- get_shape_model_contours(&ModelContours, ModelID, 1);
- vector_angle_to_rigid(0, 0, 0, Row, Column, 0, &HomMat2D1);
- affine_trans_contour_xld(ModelContours, &ContoursAffinTrans, HomMat2D1);
- //获得模板的最小外接矩形
- gen_region_contour_xld(ContoursAffinTrans, &Region1, "filled");
- union1(Region1, &RegionUnion1);
- smallest_rectangle1(RegionUnion1, &Row1, &Column1, &Row2, &Column2);
- int y1 = Row1[0].I();
- int x1 = Column1[0].I();
- int y2 = Row2[0].I();
- int x2 = Column2[0].I();
- printf("外接矩形左上角的坐标为:(%d,%d)\n", x1, y1);
- printf("外接矩形右下角的坐标为:(%d,%d)\n", x2, y2);
-
- clear_shape_model(ModelID);
- return 0;
- }
复制代码
需要的效果就是注释掉read_image这个算子,然后能够运行出图2的结果。
在halcon的代码:- set_system ('border_shape_models', 'false')
- set_system('clip_region',false)
- * dev_set_part (0, 0, 1024, 1024)
- read_shape_model ('C:/Users/Administrator/Desktop/zhujian/1233.shm', ModelID)
- read_tuple ('C:/Users/Administrator/Desktop/imgs/123.tup', Tuple)
- Row :=Tuple[0]
- Column :=Tuple[1]
- *读取模板并把模板仿射变换到原来的位置
- get_shape_model_contours (ModelContours, ModelID, 1)
- vector_angle_to_rigid (0, 0, 0, Row, Column, 0, HomMat2D1)
- affine_trans_contour_xld (ModelContours, ContoursAffinTrans, HomMat2D1)
- *读取模板轮廓的坐标点
- rows :=[]
- cols :=[]
- count_obj (ContoursAffinTrans, Number)
- for I := 1 to Number by 1
- select_obj (ContoursAffinTrans, ObjectSelected, I)
- get_contour_xld (ObjectSelected, r, c)
- rows:=[rows,r]
- cols:=[cols,c]
- endfor
- * gen_contour_region_xld (ContoursAffinTrans, Contours, 'border')
- stop ()
- numbers :=|rows|
- *获得模板的最小外接矩形
- gen_region_contour_xld (ContoursAffinTrans, Region, 'filled')
- union1 (Region, RegionUnion1)
- smallest_rectangle1 (RegionUnion1, Row1, Column1, Row2, Column2)
- gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)
- dev_display (ContoursAffinTrans)
- dev_display (Rectangle)
复制代码 在halcon中不读取图片也是可以读到坐标的,然后有意思的是在halcon的路径中把halconcpp.dll删掉,同样读取不到坐标
注:在vs配置是没有问题的
|