Opencv中查找轮廓,并用直线拟合,检测每个轮廓的线性程度
代码中利用canny边缘检测绘制并取得工程目录图片下的轮廓,对每个轮廓用直线进行拟合,计算每个轮廓中点到拟合直线的距离。以此来判断一个轮廓的线性程度。包括了霍夫变换检测图像中的直线和累计概率霍夫变换检测图像中的直线
代码片段和文件信息
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2018-08-20 21:06 line
目录 0 2018-08-21 15:38 lineline
目录 0 2018-08-20 21:22 linelineDebug
目录 0 2018-08-21 15:03 linelineipch
目录 0 2018-08-21 15:03 linelineipchline-370f6cc7
文件 65601536 2018-08-21 15:03 linelineipchline-370f6cc7line-a622a532.ipch
目录 0 2018-08-21 15:36 linelineline
文件 17125376 2018-08-21 15:38 linelineline.sdf
文件 1233 2018-08-20 21:22 linelineline.sln
文件 15360 2018-08-21 15:38 linelineline.suo
目录 0 2018-08-20 21:22 linelinelineDebug
文件 528 2018-08-20 21:22 linelinelineDebugcl.command.1.tlog
文件 25720 2018-08-20 21:22 linelinelineDebugCL.read.1.tlog
文件 288 2018-08-20 21:22 linelinelineDebugCL.write.1.tlog
文件 55 2018-08-20 21:22 linelinelineDebugline.lastbuildstate
文件 1726 2018-08-20 21:22 linelinelineDebugline.log
文件 391948 2018-08-20 21:22 linelinelineDebugline.obj
文件 0 2018-08-20 21:22 linelinelineDebugline.unsuccessfulbuild
文件 713 2018-08-20 21:22 linelinelineDebugline.vcxprojResolveAssemblyReference.cache
文件 0 2018-08-20 21:22 linelinelineDebugline.write.1.tlog
文件 2 2018-08-20 21:22 linelinelineDebuglink.command.1.tlog
文件 2 2018-08-20 21:22 linelinelineDebuglink.read.1.tlog
文件 2 2018-08-20 21:22 linelinelineDebuglink.write.1.tlog
文件 781312 2018-08-20 21:22 linelinelineDebugvc100.idb
文件 1314816 2018-08-20 21:22 linelinelineDebugvc100.pdb
文件 3901 2018-08-21 15:37 linelinelineline.cpp
文件 6736 2018-08-21 08:35 linelinelineline.vcxproj
文件 1155 2018-08-21 08:35 linelinelineline.vcxproj.filters
文件 143 2018-08-20 21:06 linelinelineline.vcxproj.user
文件 3966 2018-08-21 11:14 linelinelineline_fit.cpp
文件 364 2018-08-21 10:49 linelinelineline_fit.h
............此处省略26个文件信息
//头文件
#include “opencv2/opencv.hpp“
#include
#include
#include
#include “line_fit.h“
using namespace cv;
using namespace std;
//宏定义
#define random(x) ((rand())%x)
//全局变量
//函数声明
int main()
{
/*载入原图片*/
//Mat src = imread(“E://pic_F.L//Picture//OK1.jpg“ 1);//原始图片
Mat src = imread(“OK1.jpg“);
Mat gray;//原始的灰度图
cvtColor(srcgrayCOLOR_RGB2GRAY);
/*图片预处理*/
//平滑滤波使图像的背景尽量统一
Mat _gray;
bilateralFilter(gray_gray55*25/2); //图像滤波
imshow(“平滑处理的图像“_gray);
//图像增强,突出边缘
Mat ruihua;
Mat kernel = (Mat_(33) << 0 -1 0
-1 5 -1
0 -1 0); //定义增强图像的卷积核
filter2D(_grayruihuagray.depth()kernel); //先滤波,再增强。高通滤波器锐化边缘
imshow(“增强后的图像“ruihua);
/*边缘检测*/
Mat canny_output;//边缘检测的输出图像
Canny(ruihua canny_output 60 150 3);
imshow(“canny边缘检测的输出图“ canny_output);
/*利用标准霍夫变换检测途中的直线*/
////检测线段
//vector lines;//存放检测到的直线
//Mat H_result;
//cvtColor(gray H_result CV_GRAY2BGR);
//HoughLines(canny_output lines 1 CV_PI/180 150 0 0);
//画出线段
//for(size_t i=0; i //{
// float rho = lines[i][0] theta = lines[i][i];
// Point pt1pt2;
// double a =cos(theta) b=sin(theta);
// double x0=a*rhoy0 = b*rho;
// pt1.x=cvRound(x0 + 1000*(-b));
// pt1.y=cvRound(x0 + 1000*(a));
// pt2.x=cvRound(x0 - 1000*(-b));
// pt2.y=cvRound(x0 - 1000*(a));
// line(H_result pt1 pt2 Scalar(255) 1 LINE_AA);
//}
//imshow(“直线检测的结果“ H_result);
/*利用累计概率霍夫变换检测直线*/
////检测线段
//vector lines;
//HoughLinesP(canny_output lines 1 CV_PI/180 80 50 10);
//Mat HP_result;
//cvtColor(gray HP_result CV_GRAY2BGR);
////画出线段
//for(size_t i=0; i //{
// Vec4i l = lines[i];
// line(HP_result Point(l[0] l[1]) Point(l[2]l[3]) Scalar(255)1 LINE_AA);
//}
//imshow(“直线检测结果“ HP_result);
/*fitline()拟合直线*/
//获取轮廓,得到一系列的输入点集
vector> cal_contour;//存放轮廓
vector contours;
vector hierarchy;
findContours(canny_output contours hierarchy RETR_TREE CHAIN_APPROX_NONE);
findContours(canny_output cal_contour hierarchy RETR_TREE CHAIN_APPROX_NONE);
cv::Mat image = cv::Mat::zeros(gray.size()CV_8UC3);
vector lines(contours.size());
double dis_total=0.0;
for(size_t i=0; i {
{
fitLine(contours[i] lines[i] DIST_L2 0 1e-2 1e-2);//拟合直线
//画线
//获取点斜式的点和斜率
cv::Point point0;
point0.x = lines[i][2];
point0.y = lines[i][3];
double k = lines[i][1] / lines[i][0];
//计算直线的端点(y = k(x - x0) + y0)
cv::Point point1 point2;
point1.x = 0;
point1.y = k * (0 - point0.x) + point0.y;
point2.x = 640;
point2.y = k * (640 - point0.x) + point0.y;
/*计算线性度指标*/
double dis = 0.0;
if(contours[i].size > 0)
{
for(int k=0; k {
for(int l=0; l
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2018-08-20 21:06 line
目录 0 2018-08-21 15:38 lineline
目录 0 2018-08-20 21:22 linelineDebug
目录 0 2018-08-21 15:03 linelineipch
目录 0 2018-08-21 15:03 linelineipchline-370f6cc7
文件 65601536 2018-08-21 15:03 linelineipchline-370f6cc7line-a622a532.ipch
目录 0 2018-08-21 15:36 linelineline
文件 17125376 2018-08-21 15:38 linelineline.sdf
文件 1233 2018-08-20 21:22 linelineline.sln
文件 15360 2018-08-21 15:38 linelineline.suo
目录 0 2018-08-20 21:22 linelinelineDebug
文件 528 2018-08-20 21:22 linelinelineDebugcl.command.1.tlog
文件 25720 2018-08-20 21:22 linelinelineDebugCL.read.1.tlog
文件 288 2018-08-20 21:22 linelinelineDebugCL.write.1.tlog
文件 55 2018-08-20 21:22 linelinelineDebugline.lastbuildstate
文件 1726 2018-08-20 21:22 linelinelineDebugline.log
文件 391948 2018-08-20 21:22 linelinelineDebugline.obj
文件 0 2018-08-20 21:22 linelinelineDebugline.unsuccessfulbuild
文件 713 2018-08-20 21:22 linelinelineDebugline.vcxprojResolveAssemblyReference.cache
文件 0 2018-08-20 21:22 linelinelineDebugline.write.1.tlog
文件 2 2018-08-20 21:22 linelinelineDebugli
文件 2 2018-08-20 21:22 linelinelineDebugli
文件 2 2018-08-20 21:22 linelinelineDebugli
文件 781312 2018-08-20 21:22 linelinelineDebugvc100.idb
文件 1314816 2018-08-20 21:22 linelinelineDebugvc100.pdb
文件 3901 2018-08-21 15:37 linelinelineline.cpp
文件 6736 2018-08-21 08:35 linelinelineline.vcxproj
文件 1155 2018-08-21 08:35 linelinelineline.vcxproj.filters
文件 143 2018-08-20 21:06 linelinelineline.vcxproj.user
文件 3966 2018-08-21 11:14 linelinelineline_fit.cpp
文件 364 2018-08-21 10:49 linelinelineline_fit.h
............此处省略26个文件信息
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件举报,一经查实,本站将立刻删除。
评论列表(条)