Opencv中查找轮廓,并用直线拟合,检测每个轮廓的线性程度


代码中利用canny边缘检测绘制并取得工程目录图片下的轮廓,对每个轮廓用直线进行拟合,计算每个轮廓中点到拟合直线的距离。以此来判断一个轮廓的线性程度。包括了霍夫变换检测图像中的直线和累计概率霍夫变换检测图像中的直线
资源截图
代码片段和文件信息
//头文件
#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  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个文件信息

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件举报,一经查实,本站将立刻删除。

发表评论

评论列表(条)