图像练习OpenCV(01)

news2024/11/28 7:49:35

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

源图像

 

结果展示

代码
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.coloradmin.cn/o/1028485.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【2023集创赛】Arm杯二等奖作品:基于Arm Cortex-M3的体感节奏音乐游戏机

本文为2023年第七届全国大学生集成电路创新创业大赛&#xff08;“集创赛”&#xff09;安谋科技杯全国二等奖作品分享&#xff0c;参加极术社区的【有奖征集】分享你的2023集创赛作品&#xff0c;秀出作品风采&#xff0c;分享2023集创赛作品扩大影响力&#xff0c;更有丰富电…

跑腿系统开发:构建实时任务分配算法的技术挑战

在跑腿系统中&#xff0c;实时任务分配算法是确保任务快速高效完成的关键因素之一。本文将介绍构建实时任务分配算法时可能面临的技术挑战&#xff0c;并提供一个简单的Python示例来解决这些挑战。 技术挑战&#xff1a; 实时数据处理&#xff1a; 跑腿系统需要处理大量的实时任…

Ganache本地测试网+cpolar内网穿透实现公网访问内网

文章目录 前言1. 本地环境服务搭建2. 局域网测试访问3. 内网穿透3.1 ubuntu本地安装cpolar内网穿透3.2 创建隧道3.3 测试公网访问 4. 配置固定二级子域名4.1 保留一个二级子域名4.2 配置二级子域名4.3 测试访问公网固定二级子域名 前言 网&#xff1a;我们通常说的是互联网&am…

K8S:Pod概念、分类及相关的策略

文章目录 一.pod相关概念&#xff11;.Pod基础概念&#xff12;.Kubrenetes集群中Pod两种使用方式&#xff13;.pause容器的Pod中的所有容器共享的资源&#xff14;.kubernetes中的pause容器主要为每个容器提供功能&#xff1a;&#xff15;.Kubernetes设计这样的Pod概念和特殊…

本地搭建CFimagehost私人图床——“cpolar内网穿透”

文章目录 1.前言2. CFImagehost网站搭建2.1 CFImagehost下载和安装2.2 CFImagehost网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar临时数据隧道3.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 4.公网访问测…

7.algorithm2e中while怎么使用

algorithm2e中while怎么使用 在 algorithm2e 宏包中&#xff0c;要使用 while 循环&#xff0c;您可以使用 \While 和 \EndWhile 命令来定义循环的开始和结束。以下是如何使用 while 循环的示例&#xff1a; \documentclass{article} \usepackage[linesnumbered,boxed]{algorit…

Mac电脑音视频播放器: Infuse for Mac中文

Infuse是一款流行的多媒体播放器应用程序&#xff0c;适用于iOS、tvOS和macOS平台。它由Firecore开发&#xff0c;旨在提供出色的媒体播放体验&#xff0c;并支持广泛的视频和音频格式。 以下是Infuse的一些主要功能和特点&#xff1a; 多媒体格式支持&#xff1a;Infuse支持…

ROS2 从头开始​​:第 1 部分 — 机器人操作系统简介

火星上的机器人&#xff08;AI生成图像&#xff09; 一、说明 ROS2是机器人的朋友&#xff0c;一个他们所依赖的平台&#xff0c;用于沟通、协调和控制&#xff0c;帮助他们实现目标。ROS2以DDS为核心&#xff0c;帮助机器人探索新世界、新任务、新可能性&#xff0c;是一个方…

代码随想录--链表-反转链表

题意&#xff1a;反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 双指针 public class Main {public static class ListNode {int val;ListNode next;ListNode(int x) {val x;}}public ListNode reverseList(L…

涨知识,关于代码签名证书10大常见问题解答

在当今互联网时代&#xff0c;各种软件程序充斥着这个网络世界&#xff0c;大大小小的软件层出不穷&#xff0c;如何让用户信任软件并下载软件&#xff0c;是众多软件开发公司需要解决的问题&#xff0c;由此代码签名证书应运而生&#xff0c;提供了软件程序的身份认证、完整性…

uni-app获取元素具体位置获取失败

场景&#xff1a;想要通过链接跳转传递catid&catid2类别id,商品类别id 跳到这一页左侧对应的类别栏上面,同时跳到右侧列表滚动到对应商品那一块区域。 遇到的问题&#xff1a;在for循环中通过绑定id获取不到商品列表的具体位置。 原因&#xff1a;在onReady函数和mounted函…

【Java】医院智能导诊系统源码:解决患者盲目就诊问题、降低患者挂错号比例

医院智能导诊系统解决患者盲目就诊问题&#xff0c;减轻分诊工作压力。降低患者挂错号比例&#xff0c;优化患者就诊流程&#xff0c;有效提高线上线下医疗机构接诊效率。患者可通过人体画像选择症状部位&#xff0c;了解对应病症信息和推荐就医科室。 一、医院智能导诊系统概述…

科锐逆向第二阶段(一)SDK

基本概念 什么是 SDK SDK 是软件开发工具包&#xff08;Software Development Kit&#xff09;的缩写。它是一个集成了软件开发所需工具、库文件、示例代码和文档等资源的软件包。 SDK 通常由软件开发公司或平台提供&#xff0c;旨在帮助开发人员构建、测试和部署特定类型的…

Offset Explorer(Kafka消息可视化工具)报invalid hex digit ‘{‘错误解决方法

解决办法&#xff1a; 根据代码的实际情况&#xff0c;设置成对应的值。设置完成后点update、refresh更新。

excel 通过SUMIF关键词统计词频

经常会对句子中含有的某些词汇数量进行统计&#xff0c;excel 也可以实现初级的操作 比如有如下文本 想要统计旅游和好两个词在这些文本中出现了多少次 用如下函数即可 SUMIF(A:A,"*"&C2&"*",B:B) 可以很方便的统计出好出现了3次数据&#xff0…

Python爬虫有哪些库,分别怎么用

目录 Python常用爬虫库 代码示例 requests BeautifulSoup Scrapy Selenium PyQuery Axios requests-html pyppeteer 总结 Python是一种非常流行的编程语言&#xff0c;因其易学易用和广泛的应用而受到开发者的喜爱。在Python中&#xff0c;有许多库可以用于爬虫程序…

“探索前后端分离架构下的Vue.js应用开发“

目录 引言1. 前后端分离2. Vue的简介1. Vue.js是什么&#xff1f;2. 库和框架的区别3. MVVM的介绍 3. Vue的入门数据的双向绑定数据的单项绑定 4. Vue的生命周期总结 引言 在当今互联网时代&#xff0c;前后端分离架构已经成为了Web应用开发的主流趋势。前后端分离架构的核心思…

【二叉树-02】二叉树的最近公共祖先-力扣 236 题

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

DC系列靶机3通关教程

文章目录 信息收集主机扫描端口扫描目录扫描 漏洞查找Joomscansearchsploit 漏洞利用SQL注入密码爆破反弹shell得到交互shell 提权查看操作系统版本信息搜索操作系统漏洞利用exp提权查找flag 信息收集 主机扫描 arp-scan -l端口扫描 nmap -p- -A 192.168.16.162-A&#xff1…

月木学途开发 5.轮播图模块

概述 效果图 数据库设计 轮播图表 DROP TABLE IF EXISTS banner; CREATE TABLE banner (bannerId int(11) NOT NULL AUTO_INCREMENT,bannerUrl longtext,bannerDesc varchar(255) DEFAULT NULL,bannerTypeId int(11) DEFAULT NULL,PRIMARY KEY (bannerId) ) ENGINEInnoDB AU…