当前位置: 首页 > news >正文

图像练习-矩形4点OpenCV(01)

提取出里面最大矩形的四个顶点坐标 

源图像

结果展示

代码
void getLine(std::vector<int>& data, int threshold)
{for (int x = 0; x < data.size(); x++){if (0 == data[x]){continue;}int maxValue = 0, maxLoc = -1, i = -1;for (i = x; i < data.size(); ++i){if (data[i] > maxValue){maxValue = data[i];maxLoc = i;}if (data[i] == 0){break;}data[i] = 0;}x = i;data[maxLoc] = 1;}
}void rectangle_vertex_old()
{cv::Mat image = cv::imread("rectangle_vertex.jpg", cv::IMREAD_COLOR);cv::Mat gray;cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);cv::Mat binary = gray < 100;//计算x及y方向投影std::vector<int> widthHist(binary.cols, -1);std::vector<int> heightHist(binary.rows, -1);for (int y = 0; y < binary.rows; y++){for (int x = 0; x < binary.cols; x++){int value = (int)binary.at<uchar>(y, x) / 255.0;heightHist[y] = heightHist[y] + value;widthHist[x] = widthHist[x] + value;}}int histThreshold = (int)(binary.rows * 0.7);//y方向的投影二值化for (int y = 0; y < binary.rows; y++){if (heightHist[y] < histThreshold){heightHist[y] = 0;}}//计算水平线的位置getLine(heightHist, histThreshold);histThreshold = (int)(binary.cols * 0.7);//x方向的投影二值化for (int y = 0; y < binary.cols; y++){if (widthHist[y] < histThreshold){widthHist[y] = 0;}}//计算垂直线的位置getLine(widthHist, histThreshold);//寻找左上点左下点cv::Point ptLeftTop(-1, -1), ptLeftDown(-1, -1);for (int x = 0; x < binary.cols; x++){if (widthHist[x] == 1){for (int y = 0; y < binary.rows; y++){if (heightHist[y] == 1){ptLeftTop.x = x;ptLeftTop.y = y;}}for (int y = binary.rows - 1; y > 0; y--){if (heightHist[y] == 1){ptLeftDown.x = x;ptLeftDown.y = y;}}break;}}//寻找右上点右下点cv::Point ptRightTop(-1, -1), ptRightDown(-1, -1);for (int x = binary.cols - 1; x > 0; x--){if (widthHist[x] == 1){for (int y = 0; y < binary.rows; y++){if (heightHist[y] == 1){ptRightTop.x = x;ptRightTop.y = y;}}for (int y = binary.rows - 1; y > 0; y--){if (heightHist[y] == 1){ptRightDown.x = x;ptRightDown.y = y;}}break;}}//画出4个点if (ptLeftTop != cv::Point(-1, -1)){cv::circle(image, ptLeftTop, 4, cv::Scalar(0, 0, 255, 0), 4);}if (ptLeftDown != cv::Point(-1, -1)){cv::circle(image, ptLeftDown, 4, cv::Scalar(0, 0, 255, 0), 4);}if (ptRightTop != cv::Point(-1, -1)){cv::circle(image, ptRightTop, 4, cv::Scalar(0, 0, 255, 0), 4);}if (ptRightDown != cv::Point(-1, -1)){cv::circle(image, ptRightDown, 4, cv::Scalar(0, 0, 255, 0), 4);}cv::namedWindow("src_old");cv::imshow("src_old", image);cv::waitKey();
}

http://www.lryc.cn/news/177493.html

相关文章:

  • 不同层设置不同学习率
  • 剑指offer32Ⅰ:从上到下打印二叉树
  • 【VUE复习·8】v-if;v-show高级
  • 线程同步需要注意什么?
  • 力扣算法题:35、搜索插入位置.java版
  • 七、热力图展示
  • 基于微信小程序的新闻发布平台小程序设计与实现(源码+lw+部署文档+讲解等)
  • 【论文阅读】Directional Connectivity-based Segmentation of Medical Images
  • 借“牛油果”爆款出圈,甜啦啦的底牌只是“价格”?
  • 【C语言】快速排序
  • Java列表查询Long(id)到前端转换出错
  • react import爆红
  • ThreeJS-3D教学三:平移缩放+物体沿轨迹运动
  • 玩玩“小藤”开发者套件 Atlas 200I DK A2 之VSCode远程连接
  • 安装python中tensorflow和keras==2.2.0的路程
  • Linux命令历史记录管理:使用history命令提高工作效率
  • Armv9 Cortex-A720的L1 memory system 和 L1 Cache
  • 使用超声波清洗机洗眼镜有哪些注意事项、高颜值超声波清洗机推荐
  • 23种设计模式汇总详解
  • stream流的filter和map过滤
  • Linux 环境下使用 Docker 部署 Seata 1.7.1 (图文教程)
  • Aruba CX交换机 VSF配置
  • 使用ElementUI结合Vue完善主页的导航菜单和书籍管理以及后台数据分页查询
  • 子序列问题集合
  • idea中提示:error has occurred, please check your installation and try again
  • MySQL - 关于约束类型和作用的介绍
  • 【2023集创赛】芯原杯一等奖作品:基于芯原DSP核的智能语音SoC设计
  • 代理IP与Socks5代理在跨界电商、爬虫、游戏和网络安全中的应用
  • DDS信号发生器Verilog波形发生器FPGA
  • 基于springboot实现二手交易平台管理系统演示【项目源码】分享