1.直线检测
↑左图是某个点的r-角度曲线,右图将好几个点的曲线放到了一个坐标系下,它们有一个相交的点,说明在这个角度,它们都在离原点距离为r的同一条直线上!!!
↓这里的cat.png是很随意的几条线组成的图片
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <opencv2\objdetect\objdetect.hpp>
#include <opencv2\imgproc\types_c.h>
#include <opencv2\objdetect\objdetect_c.h>
#include<opencv2/opencv.hpp>
#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;
using namespace cv;
int main()
{
Mat src,dst;
src=imread("cat.png");
if(src.empty())
{
cout<<"!!???"<<endl;
return -1;
}
namedWindow("cat!",1);
imshow("cat!",src);
namedWindow("out",1);
Mat src_gray;
Canny(src,src_gray,150,200);
cvtColor(src_gray,dst,CV_GRAY2BGR);//转回彩图
imshow("gray",src_gray);
vector<Vec4f>plines;
HoughLinesP(src_gray,plines,1,CV_PI/180.0,10,0,10);
Scalar color=Scalar(0,0,255);
for(size_t i=0;i<plines.size();i++)
{
Vec4f hline=plines[i];
line(dst,Point(hline[0],hline[1]),Point(hline[2],hline[3]),color,3,LINE_AA);
}
imshow("out",dst);
waitKey(0);
return 0;
}
2.圆检测
↓检测这个图cat.jpg
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <opencv2\objdetect\objdetect.hpp>
#include <opencv2\imgproc\types_c.h>
#include <opencv2\objdetect\objdetect_c.h>
#include<opencv2/opencv.hpp>
#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;
using namespace cv;
int main()
{
Mat src,dst;
src=imread("cat.jpg");
if(src.empty())
{
cout<<"!!???"<<endl;
return -1;
}
namedWindow("cat!",1);
imshow("cat!",src);
namedWindow("out",1);
//中值滤波
Mat m;
medianBlur(src,m,3);
cvtColor(m,m,CV_BGR2GRAY);
//霍夫检测
vector<Vec3f>p;
HoughCircles(m,p,CV_HOUGH_GRADIENT,1,20,100,30,10,40);
src.copyTo(dst);
for(size_t i=0;i<p.size();i++)
{
Vec3f cc=p[i];
circle(dst,Point(cc[0],cc[1]),cc[2],Scalar(0,0,255),2,LINE_AA);
circle(dst,Point(cc[0],cc[1]),2,Scalar(27,231,167),2,LINE_AA);
}
imshow("out",dst);
waitKey(0);
return 0;
}