OpenCV中文网站

 找回密码
 立即注册
搜索
热搜: 安装 配置
查看: 2809|回复: 1

不懂就问,canny如何忽略内边缘

[复制链接]
发表于 2019-7-1 19:22:09 | 显示全部楼层 |阅读模式
右边是源图

仔细看可以发现黄色方框canny出结果有内外两层边缘
如何忽略内边缘?或者如何让canny把黄色方框直接识别成一个方框?


源码如下
  1. auto testtest = cv::imread("test4.jpg");

  2.         if (!testtest.size)
  3.         {
  4.                 OutputDebugStringA("Failed to load testtest.png");
  5.                 return;
  6.         }

  7.         cv::Mat gray(testtest.cols, testtest.rows, CV_8UC1);

  8.         cv::cvtColor(testtest, gray, cv::COLOR_RGB2GRAY);

  9.         cv::Mat canny, contour;
  10.        
  11.         cv::Canny(gray, canny, 10, 200, 3, true);
  12.         contour = cv::Mat::zeros(canny.rows, canny.cols, CV_8UC3);

  13.         std::vector<std::vector<cv::Point>> vContours, vCurve;
  14.         std::vector<cv::Vec4i> vHierarchy;

  15.         cv::findContours(canny, vContours, vHierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE, cv::Point(0, 0));
  16.         cv::RNG g_rng(12345);
  17.         cv::Scalar color = cv::Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255));

  18.         std::vector<cv::Point> approx;

  19.         std::vector<std::vector<cv::Point>> squares;

  20.         for (size_t i = 0; i < vContours.size(); i++)
  21.         {
  22.                 cv::approxPolyDP(cv::Mat(vContours[i]), approx, 1.0, true);

  23.                 if (approx.size() == 4 &&
  24.                         fabs(cv::contourArea(cv::Mat(approx))) > 100 &&
  25.                         cv::isContourConvex(cv::Mat(approx)))
  26.                 {
  27.                         double maxCosine = 0;

  28.                         for (int j = 2; j < 5; j++)
  29.                         {
  30.                                 double cosine = fabs(Angle(approx[j - 1], approx[j - 2], approx[j % 4]));
  31.                                 maxCosine = MAX(maxCosine, cosine);
  32.                         }

  33.                         if (maxCosine < 0.3)
  34.                         {
  35.                                 squares.push_back(approx);
  36.                         }
  37.                 }
  38.         }

  39.         drawContours(contour, squares, -1, color, 1, 8);

  40.         imshow("test image", testtest);
  41.         imshow("canny image", canny);
  42.         imshow("contour Image", contour);
  43.         cv::waitKey();
复制代码



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|OpenCV中文网站

GMT+8, 2024-4-20 09:53 , Processed in 0.009089 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表