#include"Header.h"
void Displaying(Mat image, int X, int Y, int data) // 标识数据
{
Point org(X, Y);
int lineType = 8;
char c[8];
sprintf(c, "%d", data);
putText(image, c, org, CV_FONT_HERSHEY_COMPLEX, 1,
Scalar(0, 0, 255), 1, lineType);
}
void HPC(Mat gray, Mat src) // gray为输入Mat(灰度),src为显示原图的输出Mat(RGB)
{
Mat gray_GB;
GaussianBlur(gray, gray_GB, Size(9, 9), 2, 2);
vector<Vec3f> circles;
HoughCircles(gray_GB, circles, CV_HOUGH_GRADIENT, 1, gray_GB.rows / 8,
HoughCircle_param_1, HoughCircle_param_2, HoughCircle_min_radius,
HoughCircle_max_radius); // 霍夫圆变换
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]);
if (gray.at<unsigned char>(center) == 255) {
circle(src, center, 3, Scalar(0, 255, 0), -1, 8, 0); // 画出圆心
circle(src, center, radius, Scalar(0, 0, 255), 2, 8, 0); // 画出半径
// 输出圆心和半径
cout << "圆心:(" << cvRound(circles[i][0]) << "," << cvRound(circles[i][1])
<< ") 半径:" << cvRound(circles[i][2]) << endl;
Displaying(src, cvRound(circles[i][0]), cvRound(circles[i][1]), radius);
}
}
}
void Compare(int i, int j, Mat dist, Mat gray_binary)
{
float temp = dist.at<float>(i, j);
if (temp + value >= dist.at<float>(i - 1, j - 1)
&& temp + value >= dist.at<float>(i - 1, j)
&& temp + value >= dist.at<float>(i - 1, j + 1)
&& temp + value >= dist.at<float>(i, j - 1)
&& temp + value >= dist.at<float>(i, j + 1)
&& temp + value >= dist.at<float>(i + 1, j - 1)
&& temp + value >= dist.at<float>(i + 1, j)
&& temp + value >= dist.at<float>(i + 1, j + 1)
&& gray_binary.at<unsigned char>(i, j) >= 128)
lines.push_back(Point(i - 1, j - 1)); // 所有局部最大值点都存入山脊线集合
}
void MarkLinesVertical()
{
int i, j;
int temp_0 = lines[0][0];
int temp_1 = lines[0][1];
int count = 1;
for (i = 1; i < lines.size(); i++) // 去除掉斜线、竖线、圆心
{
if (lines[i][0] <= temp_0 + 5// 判断是否为同纵轴上连续的两点
&& lines[i][1] == temp_1)
{
count++; // 是同纵轴连续点,计数加1
}
else
{
if (count >= 5)
{
for (j = i - count; j < i; j++)
lines_vertical.push_back(lines[j]);
}
count = 0;
}
temp_0 = lines[i][0]; // 当前值替换暂存值
temp_1 = lines[i][1];
}
for (i = 0; i < lines_vertical.size() - 1; i++)
{
src.at<Vec3b>(lines_vertical[i] //上下效果相同,此处有自动优化?
//Point(lines_vertical[i][1], lines_vertical[i][0])
) = Vec3b(255, 0, 0); // 标出垂直山脊线(蓝色)
if (lines_vertical[i + 1][0] <= lines_vertical[i][0] + 5
&& lines_vertical[i + 1][1] == lines_vertical[i][1])
line(src, Point(lines_vertical[i + 1][1], lines_vertical[i + 1][0]),
Point(lines_vertical[i][1], lines_vertical[i][0]),
Scalar(255, 0, 0), 1, CV_AA); // 标为蓝色
if (lines_vertical[i][1] == lines_vertical[i + 1][1]
&& lines_vertical[i + 1][0] - lines_vertical[i][0] > 5
&& lines_vertical[i + 1][0] - lines_vertical[i][0] < 30)
rectangle(src,
Point(lines_vertical[i][1] - 10, lines_vertical[i][0]),
Point(lines_vertical[i + 1][1] + 10, lines_vertical[i + 1][0]),
Scalar(0, 0, 255), 1, 8);
}
}
void MarkLinesHorizontal()
{
int i, j;
int temp_0 = lines[0][0];
int temp_1 = lines[0][1];
int count = 1;
for (i = 1; i < lines.size(); i++) // 去除掉斜线、竖线、圆心
{
if (lines[i][0] == temp_0 // 判断是否为同横轴上连续的两点
&& lines[i][1] <= temp_1 + 5)
{
count++; // 是同横轴连续点,计数加1
}
else
{
if (count >= 5)
{
for (j = i - count; j < i; j++)
lines_horizontal.push_back(lines[j]);
}
count = 0;
}
temp_0 = lines[i][0]; // 当前值替换暂存值
temp_1 = lines[i][1];
}
for (i = 0; i < lines_horizontal.size() - 1; i++)
{
src.at<Vec3b>(lines_horizontal[i]) = Vec3b(255, 0, 0); // 标出水平山脊线(蓝色)
if (lines_horizontal[i + 1][0] == lines_horizontal[i][0]
&& lines_horizontal[i + 1][1] <= lines_horizontal[i][1] + 5)
line(src, Point(lines_horizontal[i + 1][1], lines_horizontal[i + 1][0]),
Point(lines_horizontal[i][1], lines_horizontal[i][0]),
Scalar(255, 0, 0), 1, CV_AA); // 标为蓝色
if (lines_horizontal[i][0] == lines_horizontal[i + 1][0]
&& lines_horizontal[i + 1][1] - lines_horizontal[i][1] > 5
&& lines_horizontal[i + 1][1] - lines_horizontal[i][1] < 30)
rectangle(src,
Point(lines_horizontal[i][1], lines_horizontal[i][0] - 10),
Point(lines_horizontal[i + 1][1], lines_horizontal[i + 1][0] + 10),
Scalar(0, 0, 255), 1, 8);
}
}
void MarkLinesPositive45()
{
int i, j;
int temp_0 = lines[0][0];
int temp_1 = lines[0][1];
int count = 1;
for (i = 1; i < lines.size(); i++) // 去除掉斜线、竖线、圆心
{
if (lines[i][0] + lines[i][1] == temp_0 + temp_1
&& lines[i][0] <= temp_0 + 10) // 判断是否为同正向45度轴上连续的两点
{
count++; // 是同正向45度轴连续点,计数加1
}
else
{
if (count >= 5)
{
for (j = i - count; j < i; j++)
lines_positive_45.push_back(lines[j]);
}
count = 0;
}
temp_0 = lines[i][0]; // 当前值替换暂存值
temp_1 = lines[i][1];
}
for (i = 0; i < lines_positive_45.size() - 1; i++)
{
src.at<Vec3b>(lines_positive_45[i]) = Vec3b(255, 0, 0); // 标出正向45度山脊线(蓝色)
if (lines_positive_45[i + 1][0] + lines_positive_45[i + 1][1] == lines_positive_45[i][0] + lines_positive_45[i][1]
&& lines_positive_45[i + 1][0] <= lines_positive_45[i][0] + 10)
line(src, Point(lines_positive_45[i + 1][1], lines_positive_45[i + 1][0]),
Point(lines_positive_45[i][1], lines_positive_45[i][0]),
Scalar(255, 0, 0), 1, CV_AA); // 标为蓝色
if (lines_positive_45[i][0] + lines_positive_45[i][1]
== lines_positive_45[i + 1][0] + lines_positive_45[i + 1][1]
&& lines_positive_45[i][1] - lines_positive_45[i + 1][1] > 10
&& lines_positive_45[i][1] - lines_positive_45[i + 1][1] < 30)
rectangle(src,
Point(lines_positive_45[i][1], lines_positive_45[i][0]),
Point(lines_positive_45[i + 1][1], lines_positive_45[i + 1][0]),
Scalar(0, 0, 255), 1, 8);
}
}
void MarkLinesNegative45()
{
int i, j;
int temp_0 = lines[0][0];
int temp_1 = lines[0][1];
int count = 1;
for (i = 1; i < lines.size(); i++) // 去除掉斜线、竖线、圆心
{
if (lines[i][0] - temp_0 == lines[i][1] - temp_1
&& lines[i][0] <= temp_0 + 10) // 判断是否为同负向45度轴上连续的两点
{
count++; // 是同负向45度轴连续点,计数加1
}
else
{
if (count >= 5)
{
for (j = i - count; j < i; j++)
lines_negative_45.push_back(lines[j]);
}
count = 0;
}
temp_0 = lines[i][0]; // 当前值替换暂存值
temp_1 = lines[i][1];
}
for (i = 0; i < lines_negative_45.size()-1; i++)
{
src.at<Vec3b>(lines_negative_45[i]) = Vec3b(255, 0, 0); // 标出负向45度山脊线(蓝色)
if (lines_negative_45[i + 1][1] - lines_negative_45[i][1] == lines_negative_45[i+1][0] - lines_negative_45[i][0]
&& lines_negative_45[i + 1][0] <= lines_negative_45[i][0] + 10)
line(src, Point(lines_negative_45[i + 1][1], lines_negative_45[i + 1][0]),
Point(lines_negative_45[i][1], lines_negative_45[i][0]),
Scalar(255, 0, 0), 1, CV_AA); // 标为蓝色
if (lines_negative_45[i + 1][0] - lines_negative_45[i][0]
== lines_negative_45[i + 1][1] - lines_negative_45[i][1]
&& lines_negative_45[i + 1][1] - lines_negative_45[i][1] > 10
&& lines_negative_45[i + 1][1] - lines_negative_45[i][1] < 30)
rectangle(src,
Point(lines_negative_45[i][1], lines_negative_45[i][0]),
Point(lines_negative_45[i + 1][1], lines_negative_45[i + 1][0]),
Scalar(0, 0, 255), 1, 8);
}
}
/**
* @brief 对输入图像进行细化
* @param src为输入图像,用cvThreshold函数处理过的8位灰度图像格式,元素中只有0与1,1代表有元素,0代表为空白
* @param maxIterations限制迭代次数,如果不进行限制,默认为-1,代表不限制迭代次数,直到获得最终结果
* @r
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
OpenCV模板 - 电路板检测 - 局部最大值分析(分水岭).zip (35个子文件)
OpenCV模板 - 电路板检测 - 局部最大值分析(分水岭)
.vs
OpenCV模板
v14
.suo 63KB
OpenCV模板.sln 1KB
OpenCV模板
sample2.jpg 56KB
opencv_world310d.dll 65MB
OpenCV模板.vcxproj 8KB
Header.h 1KB
OpenCV模板.vcxproj.filters 1KB
sample1.jpg 25KB
sample_real.jpg 114KB
tools.cpp 11KB
OpenCV模板.vcxproj.user 165B
samples.jpg 82KB
init.cpp 766B
circle.jpg 16KB
x64
Debug
Source.obj 154KB
OpenCV模板.log 4KB
vc140.pdb 1004KB
init.obj 154KB
main.obj.enc 596KB
OpenCV模板.tlog
OpenCV模板.lastbuildstate 275B
CL.write.1.tlog 3KB
CL.read.1.tlog 65KB
CL.command.1.tlog 9KB
link.write.1.tlog 1KB
link.command.1.tlog 11KB
link.read.1.tlog 4KB
main.obj 314KB
vc140.idb 1.03MB
tools.obj 562KB
sample.jpg 113KB
main.cpp 4KB
Debug
OpenCV模板.tlog
x64
Debug
OpenCV模板.pdb 3.06MB
OpenCV模板.ilk 1.13MB
OpenCV模板.exe 203KB
OpenCV模板.VC.db 11.7MB
Debug
共 35 条
- 1
资源评论
- yn14347476092021-03-25挺好的,可以参考
- wt78934342019-03-14感觉很不错,有价值的资源
- 花若柳絮迎风起2021-09-02PyCharm表示打开不了
- kavstall2018-06-22跑了一下程序,能找到电路图的缺陷,并且能得到电路板中的圆半径大小,还算可以
像风一样飞扬的少年
- 粉丝: 2
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于opencv的dnn模块实现Yolo-Fastest的目标检测python源码+模型+说明(高分项目).zip
- 使用Python调用微信本地ocr服务.zip
- 【精品推荐】人工智能在医疗中的应用.pptx
- 【精品推荐】电子医疗仪器人机接口-(1).ppt
- 【精品推荐】电子医疗仪器人机接口.ppt
- ubuntu镜像ubuntu镜像01
- 基于paddle搭建神经网络实现5种水果识别分类python源码+数据集(高分毕设).zip
- 【精品推荐】电子商务网店类型介绍.ppt
- 基于paddle搭建神经网络实现水果识别分类python源码+数据集(高分项目).zip
- 三菱plc编程口通信学习笔记.doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功