(1条消息) OpenCV图像处理实际案例(二)

本博客算法及代码参考自贾志刚老师的《OpenCV图像处理-小案例实战》,若涉及侵权问题,望通知,会第一时间删除。

功能要求:

从如下图片中找出所有直线。

 解决方案一:

直接进行霍夫直线检测

代码实现:

  1. /*=======================
  2. ========直线检测========
  3. ========================*/
  4. #include <opencv2/opencv.hpp>
  5. #include <iostream>
  6. using namespace cv;
  7. using namespace std;
  8. void detectHoughP(Mat&);
  9. int main(int argc, char** argv)
  10. {
  11. Mat src = imread("D:/VS2015_Projects/opencv_workspace/img/img_lines2.jpg",1);
  12. if (src.empty())
  13. {
  14. printf("load src img failed!\n");
  15. return -1;
  16. }
  17. imshow("src", src);
  18. detectHoughP(src);
  19. waitKey(0);
  20. return 0;
  21. }
  22. //统计概率霍夫线变换HoughLinesP()
  23. void detectHoughP(Mat& src)
  24. {
  25. Mat src_gray, binaryImg;
  26. cvtColor(src, src_gray, CV_BGR2GRAY);
  27. threshold(src_gray, binaryImg, 0, 255, THRESH_BINARY_INV | THRESH_OTSU);
  28. imshow("bin image", binaryImg);
  29. vector<Vec4i> lines; //储存着检测到的直线的参数对 (X1, Y1, X2, Y2) 的容器,也就是线段的两个端点
  30. HoughLinesP(binaryImg, lines, 1, CV_PI / 180, 30, 30, 0);
  31. Mat img_line = src.clone();
  32. //绘制直线
  33. for (size_t t = 0; t < lines.size(); t++) {
  34. Vec4i ln = lines[t];//Vec4i 就是Vec<int, 4>,里面存放4个int
  35. line(img_line, Point(ln[0], ln[1]), Point(ln[2], ln[3]), Scalar(0, 0, 255), 2, 8, 0);
  36. }
  37. imshow("line image", img_line);
  38. }

处理效果

从运行结果可看出,部分直线并未检测出来。

解决方案二:

        先进行形态学操作,然后再进行霍夫直线检测。

代码实现:

  1. /*=======================
  2. ========直线检测========
  3. ========================*/
  4. #include <opencv2/opencv.hpp>
  5. #include <iostream>
  6. using namespace cv;
  7. using namespace std;
  8. void morhpologyLines(Mat&);
  9. int main(int argc, char** argv)
  10. {
  11. Mat src = imread("D:/VS2015_Projects/opencv_workspace/img/img_lines2.jpg",1);
  12. if (src.empty())
  13. {
  14. printf("load src img failed!\n");
  15. return -1;
  16. }
  17. imshow("src", src);
  18. morhpologyLines(src);
  19. waitKey(0);
  20. return 0;
  21. }
  22. //形态学处理+霍夫直线检测
  23. void morhpologyLines(Mat& src)
  24. {
  25. Mat src_gray, binaryImg;
  26. cvtColor(src, src_gray, CV_BGR2GRAY);
  27. threshold(src_gray, binaryImg, 0, 255, THRESH_BINARY_INV | THRESH_OTSU);
  28. //imshow("bin image", binaryImg);
  29. //形态学开运算
  30. Mat morhpImage;
  31. //结构元素:关键点在于窗口的选择,此处选择类直线扁平矩形,即可筛选出水平直线
  32. Mat kernel = getStructuringElement(MORPH_RECT, Size(20, 1), Point(-1, -1));
  33. morphologyEx(binaryImg, morhpImage, MORPH_OPEN, kernel, Point(-1, -1));
  34. //imshow("morphology result", morhpImage);
  35. //图像膨胀
  36. kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
  37. dilate(morhpImage, morhpImage, kernel);
  38. //imshow("dilate lines", morhpImage);
  39. vector<Vec4i> lines;
  40. double rho = 1.0;
  41. double theta = CV_PI / 180.0;
  42. int threshold = 10; //累加平面的阈值参数,int类型,超过设定阈值才被检测出线段。
  43. //值越大,基本上意味着检出的线段越长,检出的线段个数越少。
  44. HoughLinesP(morhpImage, lines, rho, theta, threshold, 10.0);
  45. //绘制直线
  46. Mat resultImage = src.clone();
  47. for (size_t t = 0; t < lines.size(); t++) {
  48. Vec4i ln = lines[t];
  49. line(resultImage, Point(ln[0], ln[1]), Point(ln[2], ln[3]), Scalar(0, 0, 255), 2, 8, 0);
  50. }
  51. imshow("result image", resultImage);
  52. }

运行效果:

从运行结果可看出,通过预先的形态学操作,使我们的处理效果得到了很好的提升,所以应该学会合理使用和搭配各种图像处理操作。

(0)

相关推荐

  • OpenCV探索之路(四):膨胀、腐蚀、开闭运算

    腐蚀和膨胀是最基本的形态学运算. 腐蚀和膨胀是针对白色部分(高亮部分)而言的. 膨胀就是对图像高亮部分进行"领域扩张",效果图拥有比原图更大的高亮区域:腐蚀是原图中的高亮区域被蚕食 ...

  • 【从零学习OpenCV 4】直方图匹配

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<从零学习OpenCV 4>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 【从零学习OpenCV 4】两图像间的像素操作

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<从零学习OpenCV 4>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 【从零学习OpenCV 4】直方图均衡化

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<从零学习OpenCV 4>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • OpenCV探索之路(十一):轮廓查找和多边形包围轮廓

    Canny一类的边缘检测算法可以根据像素之间的差异,检测出轮廓边界的像素,但它没有将轮廓作为一个整体.所以要将轮廓提起出来,就必须将这些边缘像素组装成轮廓. OpenCV中有一个很强大的函数,它可以从 ...

  • 【从零学习OpenCV 4】图像膨胀

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<OpenCV 4开发详解>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • OpenCV探索之路(二):图像处理的基础知识点串烧

    opencv图像初始化操作 #include<opencv2\opencv.hpp> #include<opencv2\highgui\highgui.hpp> using n ...

  • 【从零学习OpenCV 4】中值滤波

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<OpenCV 4开发详解>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • OpenCV探索之路(十三):详解掩膜mask

    在OpenCV中我们经常会遇到一个名字:Mask(掩膜).很多函数都使用到它,那么这个Mask到底什么呢? 一开始我接触到Mask这个东西时,我还真是一头雾水啊,也对无法理解Mask到底有什么用.经过 ...

  • OpenCV探索之路(五):图片缩放和图像金字塔

    对图像进行缩放的最简单方法当然是调用resize函数啦! resize函数可以将源图像精确地转化为指定尺寸的目标图像. 要缩小图像,一般推荐使用CV_INETR_AREA来插值:若要放大图像,推荐使用 ...

  • 【从零学习OpenCV 4】图像修复

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<OpenCV 4开发详解>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • OpenCV常见错误及解决办法 C 与Python

    Table of Contents 说明 常见错误1: Sizes of input arguments do not match 常见错误2:Assertion failed (size.width ...

  • (7条消息) OpenCV绘制文字、图形

    文章目录 一.文字putText 二.线line 三.矩形rectangle 四.圆circle 五.椭圆ellipse() color问题:图形的颜色会受到图像通道数的影响.如图像是灰度图,那么图形 ...

  • 【从零学习OpenCV 4】边缘检测原理

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<OpenCV 4开发详解>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 【OpenCV 4开发详解】图像腐蚀

     小白学视觉",选择"星标"公众号 重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<OpenCV 4开发详解>. ...