致力于平方检测。问题就在辐射地板上。你可以看到照片。有解决这个问题的办法吗?
谢谢。
源图像:

产出:

源代码:
void EdgeDetection::find_squares(const::Mat& image,向量>& outputFrame,cv::Mat& outputFrame) { 无符号长imageSize = ( long ) (image.rows * image.cols) / 1000;if (imageSize > 1200) RESIZE = 9;if (imageSize > 600) Resize = 5;else if (imageSize > 300) RESIZE = 3;否则调整大小= 1;Mat src (大小(image.cols/ RESIZE,image.rows / RESIZE),CV_YUV420sp2BGR);// RESIZE src到img大小调整(图像,src,src.size() ,0.5,0.5,INTER_LINEAR); Mat imgeorj=image;const int N= 10;//11;Mat pyr,timg,gray0(src.size(),CV_8U),灰色; //低比例尺和高比例尺图像滤除噪声pyrDown(src,pyr,Size(src.cols / 2,src.rows /2)),pyrUp(pyr,timg,src.size()); #ifdef模糊 席模糊(Src),medianBlur(src,迷离,15); #endif vector等高线;//在图像的每个彩色平面上查找平方,用于( int c= 0;c< 3;++c) { int ch[] = {c,0};mixChannels(&timg,1,&gray0 0,1,ch,1);//尝试( int l= 0;l< N;++l) { // hack的几个阈值级别:使用Canny而不是零阈值级别。// Canny帮助捕获具有渐变阴影的平方,如果(l == 0) { //应用Canny。取滑块//的上阈值设置为0(强制边缘合并) // Canny(gray0,灰色,0,阈值5);// Canny(gray0,gray,(10+l),(10+l)*3,3);Canny(gray0,灰度,50,200,3 );//扩展canny输出以消除边缘段之间的潜在//孔扩张(灰色、灰色、Mat()、点(-1,-1));//腐蚀(灰度、灰色、Mat()、Point(-1,-1)、1);}{ //应用阈值如果l!=0: // tgray(x,y) = gray(x,y) < (l+1)* 255 /N ? 255 :0 gray = gray0 >= (l + 1) *255/ N;} //查找轮廓,并将它们全部存储为列表findContours(灰色、等高线、CV_RETR_LIST、CV_CHAIN_APPROX_SIMPLE);向量近似;//检验(size_t i= 0;i< contours.size();++i) { //近似轮廓,其精度与等高线周长approxPolyDP成正比/与轮廓周长approxPolyDP成正比,约,arcLength(Mat(contoursi),true) * 0.02,true;如果(approx.size() == 4 && fabs(contourArea(Mat(Mat(约)> 5000 &isContourConvex(Mat(约){ float maxCosine = 0;for (寄存器int j= 2;j< 5;( ++j) { //求关节边间夹角的最大余弦=fabs(角约为4,约为j-2,约为-1),maxCosine =最大值(maxCosine,余弦);} //如果所有角度的余弦都很小// (所有角都是90度),如果(maxCosine < 0.3) {squares.push_back(约),则将quandrange //顶点写入合成序列;}debugSquares(正方形,imgeorj,outputFrame);}
发布于 2014-01-03 22:09:37
您可以尝试使用Hough变换来检测直线边,并使用那些用来构造正方形的边。
https://stackoverflow.com/questions/19977952
复制相似问题