opened
Micalson
username_0
首先，非常感谢你的分享！有一个问题想要请教您，问题如下：
我在测试没有 MIPP版本的代码时，直接运行test.cpp中的angle_test()函数，最终匹配出来的结果和实际的结果相差挺大的，代码没有做任何的改动，以下为测试结果：
![default](https://user-images.githubusercontent.com/45941423/51463859-4835c600-1d9f-11e9-9e30-262b52c591fe.png)
问题复现：直接运行angle_test()函数即可，模板图片和roi都保持不变。
代码测试问题
issue
created
Micalson
username_0
@username_1
comment
created
Micalson
username_0
因为我电脑上只有vs2013，所以只测试了没有MIPP版本的代码。
comment
created
meiqua
username_1
我觉得画个框更清楚，你可以试试最新的代码：
``` c++
            // template id is angle here
            cv::RotatedRect rotatedRectangle({x, y}, {2*r, 2*r}, -match.template_id);
            cv::Point2f vertices[4];
            rotatedRectangle.points(vertices);
            for(int i=0; i<4; i++){
                int next = (i+1==4) ? 0 : (i+1);
                cv::line(img, vertices[i], vertices[next], color, 2);
            }
```
comment
created
meiqua
username_1
match.x/y 是模板crop(把没有特征点的黑边切掉)之后左上角，templ[0].width是旋转后的模板的宽度，这里最好直接用270，要不然大一圈。
不对称是正常的，角度有几度的误差。误差问题可以参考[匹配精度issue](https://github.com/username_1/shape_based_matching/issues/6#issuecomment-455061721)   
我这边跑出来的样子：  
![result](https://user-images.githubusercontent.com/12988878/51476857-b1c6cc00-1dc1-11e9-9e6e-763c906d5e60.png)
comment
created
Micalson
username_0
我终于发现真正的问题在哪里了，代码中每个模板的包裹矩形的大小是不一样的，templ[0].width和templ[0].height指的是当前模板（经过旋转的）的宽度和高度，而-match.template_id仅仅指的是当前模板相对第一个模板旋转的角度，所以不能使用
int x = match.x - templ[0].tl_x + 270 / 2 + 100;
int y = match.y - templ[0].tl_y + 270 / 2 + 100; 			
cv::RotatedRect rotatedRectangle(Point2f( x, y ), Size2f( templ[0].width, templ[0].height ), -match.template_id);
生成最终结果的矩形框，而要使用
int x = templ[0].width / 2 + match.x;
int y = templ[0].height / 2 + match.y;
cv::RotatedRect rotatedRectangle(Point2f( x, y ), Size2f( templ[0].width, templ[0].height ), 0);//旋转角度为0
来生成最终的矩形框；
另外，因为你使用的demo中的模板都是轴对称的，所以观察不到显示结果有比较大的误差，如果你使用的模板是非轴对称的，那么你最终的显示结果会相差很大，至少我测试的时候是这个样子的。 @username_1
comment
created
meiqua
username_1
嗯，要显示crop后的外接矩形是这样的，我减掉topleft是显示crop前的。
不对称的话，crop会显得没有规律，所以会感觉相差大。其实关键是点对上，可以试试直接显示匹配点：
``` c++
            for(int i=0; i<templ[0].features.size(); i++){
                auto feat = templ[0].features[i];
                cv::circle(img, {feat.x+match.x, feat.y+match.y}, 3, color, -1);
            }
```
comment
created
Micalson
username_0
是的，非常感谢你的解答
comment
closed
meiqua
username_1
issue