opencv3.0识别并提取图形中的矩形的方法
利用opencv来识别图片中的矩形。
其中遇到的问题主要是识别轮廓时矩形内部的形状导致轮廓不闭合。
1.对输入灰度图片进行高斯滤波
2.做灰度直方图,提取阈值,做二值化处理
3.提取图片轮廓
4.识别图片中的矩形
5.提取图片中的矩形
1.对输入灰度图片进行高斯滤波
cv::Matsrc=cv::imread("F:\\t13.bmp",CV_BGR2GRAY); cv::Mathsv; GaussianBlur(src,hsv,cv::Size(5,5),0,0);
2.做灰度直方图,提取阈值,做二值化处理
由于给定图片,背景是黑色,矩形背景色为灰色,矩形中有些其他形状为白色,可以参考为:
提取轮廓时,矩形外部轮廓并未闭合。因此,我们需要对整幅图做灰度直方图,找到阈值,进行二值化
处理。即令像素值(黑色)小于阈值的,设置为0(纯黑色);令像素值(灰色和白色)大于阈值的,设
置为255(白色)
//Quantizethegrayscaleto30levels intgbins=16; inthistSize[]={gbins}; //grayscalevariesfrom0to256 floatgranges[]={0,256}; constfloat*ranges[]={granges}; cv::MatNDhist; //wecomputethehistogramfromthe0-thand1-stchannels intchannels[]={0}; //calculatehist calcHist(&hsv,1,channels,cv::Mat(),//donotusemask hist,1,histSize,ranges, true,//thehistogramisuniform false); //findthemaxvalueofhist doublemaxVal=0; minMaxLoc(hist,0,&maxVal,0,0); intscale=20; cv::MathistImg; histImg.create(500,gbins*scale,CV_8UC3); //showgrayscaleofhistimage for(intg=0;g(g,0); intintensity=cvRound(binVal*255); rectangle(histImg,cv::Point(g*scale,0), cv::Point((g+1)*scale-1,binVal/maxVal*400), CV_RGB(0,0,0), CV_FILLED); } cv::imshow("histImg",histImg); //thresholdprocessing cv::MathsvRe; threshold(hsv,hsvRe,64,255,cv::THRESH_BINARY);
3.提取图片轮廓
为了识别图片中的矩形,在识别之前还需要提取图片的轮廓。在经过滤波、二值化处理后,轮廓提取后的效果比未提取前的效果要好很多。
4.识别矩形
识别矩形的条件为:图片中识别的轮廓是一个凸边形、有四个顶角、所有顶角的角度都为90度。
vectorapprox; for(size_ti=0;i 1000&& isContourConvex(Mat(approx))) { doublemaxCosine=0; for(intj=2;j<5;j++) { doublecosine=fabs(angle(approx[j%4],approx[j-2],approx[j-1])); maxCosine=MAX(maxCosine,cosine); } if(maxCosine<0.3) squares.push_back(approx); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。