
主要步骤1读取一幅,并且对其进行二值化。2对其进行形态学处理,减少孔洞等次要特征,保留其主要特征。3进行边缘提取。4进行形状轮廓匹配,得到其匹配值,从而判断是否是同一个形状。下面是演示代码:#include <iostream>#include "opencv2/opencvhpp"using namespace std;using namespace cv;int main(){Mat k=imread("E:/TestGit/8jpg",0);Mat f;Mat k1=imread("E:/TestGit/9jpg",0);Mat f1;threshold(k,f,50,255,THRESH_BINARY);//对图像进行二值化threshold(k1,f1,50,255,THRESH_BINARY);Mat closerect=getStructuringElement(MORPH_RECT,Size(3,3)); //进行结构算子生成morphologyEx(f,f,MORPH_OPEN,closerect);morphologyEx(f1,f1,MORPH_OPEN,closerect);//进行形态学开运算Mat dst = Mat::zeros(krows, kcols, CV_8UC3);Mat dst1 = Mat::zeros(k1rows, k1cols, CV_8UC3);vector<vector<Point>> w,w1;vector<Vec4i> hierarchy,hierarchy1 ;findContours(f,w,hierarchy,RETR_CCOMP,CHAIN_APPROX_SIMPLE);//提取轮廓元素findContours(f1,w1,hierarchy1,RETR_CCOMP,CHAIN_APPROX_SIMPLE);FileStorage fs("fdat",FileStorage::WRITE);fs<<"f"<<w1[0];int idx=0;double ffff=matchShapes(w[0],w1[0],CV_CONTOURS_MATCH_I3,10);//进行轮廓匹配std::cout<<ffff<<std::endl;system("pause");return 0;}这样,我们就得到了轮廓边缘的提取和匹配,满足了需要。而不同的算子具有不同的匹配算子方法。
假如四个点分别是A(xa,ya),B(xb,yb),C(xc,yc),D(xd,yd),ABCD分别在左上,右上,右下,左下。那么,四个点将满足:
xa = xd
ya = yb
xb = xc
环境
矩形 *** 作是我们在 OpenCV 里最常用的 *** 作,其中最为常见的就是包围框( Bounding Box )和旋转矩形( Rotated Box )。 其中包围框是最为常见的,对应 OpenCV 中的 boundingRect() ,使用正矩形框处物体,一般多用在目标检测中。使用包围框框柱目标物体,这种 *** 作比较简单,但是通常框中也会有一些其他的区域。其次就是使用旋转矩形,也叫最小外接矩形,对应 OpenCV 中的 minAreaRect() ,用来使用旋转矩形最大限度的框出目标物体,减小背景干扰,在 OCR 任务中较为常用。
minAreaRect() 返回了所需区域的最小斜矩形的参数,与包围框直接返回四个顶点的坐标不同,最小外接矩形返回的是矩形的 ((x, y), (w, h), angle) ,对应了矩形的中心,宽度,高度和旋转角度。
旋转角度 angle 是水平轴( x 轴)逆时针旋转,与碰到的矩形的第一条边的夹角。并且这个边的边长是 width ,另一条边边长是 height 。也就是说,在这里 width 与 height 不是按照长短来定义的。
在 OpenCV 中,坐标系原点在左上角,相对于 x 轴,逆时针旋转角度为负,顺时针旋转角度为正,所以函数 minAreaRect() 返回的角度范围时 [-90~0) 。想象一个平放的长矩形,调用 minAreaRect() 返回的角度为 -90 度。如果我们旋转图像,直到矩形树立起来,这是调用 minAreaRect() 得到的角度依然是 -90 度。
第一种裁剪旋转矩形的方法是通过仿射变换旋转图像的方式。
仿射变换( Affine Transformation ) 是一种二维坐标到二维坐标之间的线性变换,保持二维图形的“平直性”( straightness ,即变换后直线还是直线不会打弯,圆弧还是圆弧)和“平行性”( parallelness ,其实是指保二维图形间的相对位置关系不变,平行线还是平行线,相交直线的交角不变。)。
计算过程:
如果不做边长和角度的判断,则只会沿着 x 轴的顺时针方向做相同大小角度的旋转,不能保证旋转后的视角是正确的视角:
根据任务目标的类型,做边长和角度的判断并进行相应的调整,可以保证旋转后的视角是正确的视角:
第二种裁剪旋转矩形的方法是通过透视变换直接将旋转矩形的四个顶点映射到正矩形的四个顶点。
透视变换( Perspective Transformation )是将投影到一个新的视平面( Viewing Plane ),也称作投影映射( Projective Mapping )。
计算过程:
以上两种方法都可以用来抠取旋转矩形的内容。仿射变换方法需要预先对整张图进行旋转,通过观察旋转后的图像可以发现,有一部分图像被旋转出了图像边界,如果你要抠取的目标正好在图像边缘附近,那么很容易出界导致图像抠取的缺失。同时我们需要对宽、高和角度做出动态的调整;透视变换的方法直接对抠取区域进行了映射,这种方法可以省略旋转的步骤,并且不会出现抠取内容的缺失。同时我们只需要对4个顶点之间的映射关系做好定义即可,不需要考虑角度的问题。相对的,透视变换相对于仿射变换计算量更大一些,不过这在 c++ 的底层实现上带来的时延差距小于 ms 。
以上就是关于形状匹配3种极性设置方法全部的内容,包括:形状匹配3种极性设置方法、opencv中我知道四个点怎么把他炼成矩形,我不知道数组里点的顺序,有时连出来是“z”不是矩形、OpenCV Python实现旋转矩形的裁剪等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)