如何用OpenCV库进行图像中直线检测操作?

2026-05-08 17:323阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计595个文字,预计阅读时间需要3分钟。

如何用OpenCV库进行图像中直线检测操作?

上一篇文章介绍了图像的Canny边缘检测,本文主要介绍图像的直线检测部分,主要使用概率霍夫变换来检测直线,调用的函数为HoughLinesP()。

下面给出代码部分以及直线检测效果图:

pythonimport cv2import numpy as np

读取图像image=cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)

使用Canny算法检测边缘edges=cv2.Canny(image, 50, 150)

如何用OpenCV库进行图像中直线检测操作?

使用概率霍夫变换检测直线lines=cv2.HoughLinesP(edges, 1, np.pi/180, threshold=100, minLineLength=100, maxLineGap=10)

绘制检测到的直线for line in lines: x1, y1, x2, y2=line[0] cv2.line(image, (x1, y1), (x2, y2), (0, 255, 0), 2)

显示结果cv2.imshow('Detected Lines', image)cv2.waitKey(0)cv2.destroyAllWindows()

直线检测效果图:

上一篇博文介绍了图像的Canny边缘检测,本文主要介绍图像的直线检测部分,主要使用概率霍夫变换来检测直线,调用的函数为HoughLinesP(),下面给出代码部分以及直线检测效果图:

1、代码部分:

// Detect_Lines.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <cv.h> #include "highgui.h" using namespace std; using namespace cv; void drawDetectLines(Mat& image,const vector<Vec4i>& lines,Scalar & color) { // 将检测到的直线在图上画出来 vector<Vec4i>::const_iterator it=lines.begin(); while(it!=lines.end()) { Point pt1((*it)[0],(*it)[1]); Point pt2((*it)[2],(*it)[3]); line(image,pt1,pt2,color,2); //线条宽度设置为2 ++it; } } int _tmain(int argc, _TCHAR* argv[]) { Mat src_img=imread("..\\image_norm\\71253.jpg"); imshow("src_img",src_img); Mat I; cvtColor(src_img,I,CV_BGR2GRAY); Mat contours; Canny(I,contours,125,350); threshold(contours,contours,128,255,THRESH_BINARY); vector<Vec4i> lines; HoughLinesP(contours,lines,1,CV_PI/180,80,50,10); drawDetectLines(src_img,lines,Scalar(0,255,0)); imshow("Detect_Lines",src_img); cvWaitKey(0); return 0; }

2、原图以及直线检测效果图:


至此,已经实现了图像的直线检测部分,将检测出来的直线在原图中画了出来,也可以将检测出来的直线在上一篇博文中的边缘图像中画出来,效果如下:

特别说明,HoughLinesP()函数的一般步骤请参考博文:Opencv2.4.9函数HoughLinesP分析

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自由互联。

本文共计595个文字,预计阅读时间需要3分钟。

如何用OpenCV库进行图像中直线检测操作?

上一篇文章介绍了图像的Canny边缘检测,本文主要介绍图像的直线检测部分,主要使用概率霍夫变换来检测直线,调用的函数为HoughLinesP()。

下面给出代码部分以及直线检测效果图:

pythonimport cv2import numpy as np

读取图像image=cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)

使用Canny算法检测边缘edges=cv2.Canny(image, 50, 150)

如何用OpenCV库进行图像中直线检测操作?

使用概率霍夫变换检测直线lines=cv2.HoughLinesP(edges, 1, np.pi/180, threshold=100, minLineLength=100, maxLineGap=10)

绘制检测到的直线for line in lines: x1, y1, x2, y2=line[0] cv2.line(image, (x1, y1), (x2, y2), (0, 255, 0), 2)

显示结果cv2.imshow('Detected Lines', image)cv2.waitKey(0)cv2.destroyAllWindows()

直线检测效果图:

上一篇博文介绍了图像的Canny边缘检测,本文主要介绍图像的直线检测部分,主要使用概率霍夫变换来检测直线,调用的函数为HoughLinesP(),下面给出代码部分以及直线检测效果图:

1、代码部分:

// Detect_Lines.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <cv.h> #include "highgui.h" using namespace std; using namespace cv; void drawDetectLines(Mat& image,const vector<Vec4i>& lines,Scalar & color) { // 将检测到的直线在图上画出来 vector<Vec4i>::const_iterator it=lines.begin(); while(it!=lines.end()) { Point pt1((*it)[0],(*it)[1]); Point pt2((*it)[2],(*it)[3]); line(image,pt1,pt2,color,2); //线条宽度设置为2 ++it; } } int _tmain(int argc, _TCHAR* argv[]) { Mat src_img=imread("..\\image_norm\\71253.jpg"); imshow("src_img",src_img); Mat I; cvtColor(src_img,I,CV_BGR2GRAY); Mat contours; Canny(I,contours,125,350); threshold(contours,contours,128,255,THRESH_BINARY); vector<Vec4i> lines; HoughLinesP(contours,lines,1,CV_PI/180,80,50,10); drawDetectLines(src_img,lines,Scalar(0,255,0)); imshow("Detect_Lines",src_img); cvWaitKey(0); return 0; }

2、原图以及直线检测效果图:


至此,已经实现了图像的直线检测部分,将检测出来的直线在原图中画了出来,也可以将检测出来的直线在上一篇博文中的边缘图像中画出来,效果如下:

特别说明,HoughLinesP()函数的一般步骤请参考博文:Opencv2.4.9函数HoughLinesP分析

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自由互联。