本文将详细解释opencv3.0如何识别和提取图形中的矩形。这篇文章的内容质量很高,所以边肖会分享给大家参考。希望你看完这篇文章后有所了解。
使用opencv识别图片中的矩形。
其中遇到的主要问题是矩形内部的形状导致轮廓不闭合。
1.高斯滤波输入灰度图像2。制作灰度直方图,提取阈值和二值化3。提取图像的轮廓4。识别图像5中的矩形。提取图像中的矩形。
1.对输入灰度图像进行高斯滤波。
CV : mat src=CV : im read(' f : \ \ t 13 . BMP ',CV _ BGR2GRAY);cv:Mat hsvgaussianbulr(src,hsv,cv :3360 size(5,5),0,0);
2.制作灰度直方图,提取阈值,做二值化。
给定图片,背景为黑色,矩形的背景颜色为灰色,矩形中的其他一些形状为白色。可以称为:提取轮廓时,矩形的外轮廓不闭合。因此,我们需要对整个画面做一个灰度直方图,找到阈值并进行二值化。
把手。也就是说,如果像素值(黑色)小于阈值,将其设置为0(纯黑色);如果像素值(灰色和白色)大于阈值,则设置
设置为255(白色)
//将灰度量化到30级int gbins=16int HistSize[]={ gbins };
//灰度从0到256浮动灰度[]={0,256 };
const float * ranges[]={ granges };cv:MatND和hist
//我们从第0个和第1个通道计算直方图int channel[]={ 0 };
//计算hist calcHist(hsv,1,通道,cv:Mat(),
//不要使用掩码hist,1,histSize,ranges,true,
//直方图均匀假);
//求hist double maxVal=0的最大值;
minMaxLoc(hist,0,maxVal,0,0);int scale=20
cv:Mat毫安时组织;
histImg.create(500,gbins*scale,CV _ 8UC 3);
//显示hist图像的灰度(int g=0;ggbinsg ){
float binVal=hist.atfloat(g,0);
int intensity=cvRound(BinVal * 255);
矩形(组图,cv:Point点(g *比例尺,0),
CV : point((g ^ 1)* scale-1,binVal/maxVal*400),CV_RGB(0,0,0),CV _ FILLED);} cv : im show(' Histmg ',Histmg);
//阈值处理cv:Mat hsvRe
阈值(hsv,hsvRe,64,255,cv : thresh _ BInary);
3.提取图片的轮廓
为了识别图片中的矩形,在识别之前需要提取图片的轮廓。经过滤波和二值化后,轮廓提取后的效果比提取前好得多。
识别矩形
矩形识别的条件是:图片中识别出的轮廓是四个顶角的凸边形状,所有顶角的角度都是90度。
矢量点约;for(size _ t I=0;I等高线. size();I){ 0
近似值(Mat(等高线[i]),近似值,弧长(Mat(等高线[i]),真)*0.02,真);
if(约大小()==4个晶圆厂(contourArea(Mat(约)))1000 iscon sourconvex(Mat(约))){ doublemax余弦=0;
for(int j=2;j5;j ) {双余弦=fabs(角度(约[j%4],约[j-2],约[j-1]);
最大余弦=最大(最大余弦,余弦);}
if(最大余弦值0.3)平方,push_back(近似值);
} }
opencv3.0中识别和提取图形中矩形的方法是什么,希望在这里分享
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/147367.html