您的位置:首页 > 运维架构

OpenCV官方文档学习记录(18)

2014-12-16 12:57 351 查看
霍夫圆变换:

#include <opencv2\opencv.hpp>
#include <iostream>
#include <string>
#include <vector>

#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )

using namespace std;
using namespace cv;

void showImg(const string &win_name, const Mat &img)
{
namedWindow(win_name, CV_WINDOW_AUTOSIZE);
imshow(win_name, img);
}

int main(void)
{
Mat src = imread("panzi.jpg");
if (src.empty())
return -1;
Mat dst;
cvtColor(src, dst, CV_BGR2GRAY);
showImg("dst", dst);
GaussianBlur(dst, dst, Size(9, 9), 2, 2);
vector<Vec3f> circles;
HoughCircles(dst, circles, CV_HOUGH_GRADIENT, 1, dst.rows / 8, 200, 100, 0, 0);
for (size_t i = 0; i < circles.size(); ++i)
{
Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
int radius = cvRound(circles[i][2]);
circle(src, center, 3, Scalar(0, 255, 0), -1, 8, 0);//绘制圆心
circle(src, center, radius, Scalar(0, 0, 255), 3, 8, 0);//绘制圆
}
showImg("after ciecle decete", src);
waitKey();
return 0;
}


检测结果:



可见左侧的盘子没有被检出,但是却不知道是怎么回事,可能左侧不是正圆

分割检测的结果:

右侧:



左侧:



,因为用肉眼无法分辨,所以上述结果不好确定。

补充一下,当程序如下:

#include <opencv2\opencv.hpp>
#include <iostream>
#include <string>
#include <vector>

#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )

using namespace std;
using namespace cv;

void showImg(const string &win_name, const Mat &img)
{
namedWindow(win_name, CV_WINDOW_AUTOSIZE);
imshow(win_name, img);
}

int main(void)
{
Mat src = imread("split2.jpg");
if (src.empty())
return -1;
Mat dst;
cvtColor(src, dst, CV_BGR2GRAY);
GaussianBlur(dst, dst, Size(3, 3), 2, 2);
showImg("dst", dst);
vector<Vec3f> circles;
HoughCircles(dst, circles, CV_HOUGH_GRADIENT, 2, dst.rows / 8, 100, 100, 0, 0);
for (size_t i = 0; i < circles.size(); ++i)
{
Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
int radius = cvRound(circles[i][2]);
circle(src, center, 3, Scalar(0, 255, 0), -1, 8, 0);//绘制圆心
circle(src, center, radius, Scalar(0, 0, 255), 3, 8, 0);//绘制圆
}
showImg("after ciecle decete", src);
waitKey();
return 0;
}


就是圆变换的dp改成2的时候可以识别出左侧盘子的轮廓:



同时应用到整幅图上,会发现:



此时circles:



以上。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: