OpenCV | 项目 | 虚拟绘画

OpenCV | 项目 | 虚拟绘画

捕捉摄像头

如果在虚拟机中运行,请确保虚拟机摄像头打开。

#include<opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{VideoCapture cap(0);Mat img;while(1) {cap.read(img);imshow("Image", img);waitKey(1);}return 0;
}

捕捉对应单一颜色

myColors 的颜色值对应 hmin smin vmin hmax smax vmax

#include<opencv2/opencv.hpp>using namespace cv;
using namespace std;vector<vector<int>> myColors {{109,125,66,179,209,215}, // red{35, 81, 131, 52, 255, 214}}; // Greenvector<Scalar> myColorValues{   {0, 0, 255}, // red{0, 255, 0}}; // GreenMat img;void findColor(Mat img)
{Mat imgHSV;cvtColor(img, imgHSV, COLOR_BGR2HSV);for(int i = 0; i < myColors.size(); i ++){Scalar lower(myColors[i][0], myColors[i][1], myColors[i][2]);Scalar upper(myColors[i][3], myColors[i][4], myColors[i][5]);Mat mask;inRange(imgHSV, lower, upper, mask);imshow(to_string(i), mask);}
}int main()
{VideoCapture cap(0);while(1) {cap.read(img);findColor(img);imshow("Image", img);waitKey(1);}return 0;
}

添加描绘轮廓

void getContours(Mat imgDil)
{vector<vector<Point>> contours;vector<Vec4i> hierarchy;findContours(imgDil, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);vector<vector<Point>> conPoly(contours.size());vector<Rect> boundRect(contours.size());for(int i = 0; i < contours.size(); i ++){int area = contourArea(contours[i]);cout << area << endl;string objectType;if(area > 1000) {float peri = arcLength(contours[i], true);approxPolyDP(contours[i], conPoly[i], 0.02 * peri, true);drawContours(img, conPoly, i, Scalar(255, 0, 255), 2);cout << conPoly[i].size() << endl;boundRect[i] = boundingRect(conPoly[i]);}}
}void findColor(Mat img)
{Mat imgHSV;cvtColor(img, imgHSV, COLOR_BGR2HSV);for(int i = 0; i < myColors.size(); i ++){Scalar lower(myColors[i][0], myColors[i][1], myColors[i][2]);Scalar upper(myColors[i][3], myColors[i][4], myColors[i][5]);Mat mask;inRange(imgHSV, lower, upper, mask);imshow(to_string(i), mask);getContours(mask);}
}


883b27456b42a44fe730c8484118ee4.png
(不过识别的还是有点抽象的, (逃~))

添加边界框

void getContours(Mat imgDil)
{...for(int i = 0; i < contours.size(); i ++){...if(area > 1000) {...drawContours(img, conPoly, i, Scalar(255, 0, 255), 2);rectangle(img, boundRect[i].tl(), boundRect[i].br(), Scalar(0, 255, 0), 5);}}
}

绘制

#include<opencv2/opencv.hpp>using namespace cv;
using namespace std;Mat srcimg;
Mat img;vector<vector<int>> newPoints;vector<vector<int>> myColors {{118, 0, 171, 130, 255, 232}, // White{35, 81, 131, 52, 255, 214}}; // Greenvector<Scalar> myColorValues{   {255, 0, 255}, // Purple{0, 255, 0}}; // GreenPoint getContours(Mat imgDil)
{vector<vector<Point>> contours;vector<Vec4i> hierarchy;findContours(imgDil, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);vector<vector<Point>> conPoly(contours.size());vector<Rect> boundRect(contours.size());Point myPoint(0, 0);for(int i = 0; i < contours.size(); i ++){int area = contourArea(contours[i]);cout << area << endl;string objectType;if(area > 1000) {float peri = arcLength(contours[i], true);approxPolyDP(contours[i], conPoly[i], 0.02 * peri, true);cout << conPoly[i].size() << endl;boundRect[i] = boundingRect(conPoly[i]);myPoint.x = boundRect[i].x + boundRect[i].width / 2;myPoint.y = boundRect[i].y;drawContours(img, conPoly, i, Scalar(255, 0, 255), 2);rectangle(img, boundRect[i].tl(), boundRect[i].br(), Scalar(0, 255, 0), 5);}}return myPoint;
}vector<vector<int>> findColor(Mat img)
{Mat imgHSV;cvtColor(img, imgHSV, COLOR_BGR2HSV);for(int i = 0; i < myColors.size(); i ++){Scalar lower(myColors[i][0], myColors[i][1], myColors[i][2]);Scalar upper(myColors[i][3], myColors[i][4], myColors[i][5]);Mat mask;inRange(imgHSV, lower, upper, mask);imshow(to_string(i), mask);Point myPoint = getContours(mask);if(myPoint.x != 0 && myPoint.y != 0)newPoints.push_back({myPoint.x, myPoint.y, i});}return newPoints;
}void drawOnCanvas(vector<vector<int>> newPoints, vector<Scalar> myColorValues)
{for(int i = 0; i < newPoints.size(); i ++){circle(img, Point(newPoints[i][0], newPoints[i][1]), 10, myColorValues[newPoints[i][2]], FILLED);}
}int main()
{VideoCapture cap(0);while(1) {cap.read(srcimg);Mat resultImage2;flip(srcimg, img, 1);newPoints = findColor(img);drawOnCanvas(newPoints, myColorValues);imshow("Image", img);waitKey(1);}return 0;
}

可以根据捕获到的物体来进行绘制(我这里代码采用了白色物体,取值不是很准确,所以会有断断续续的点。)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/324597.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【小红书采集工具】根据搜索关键词批量采集小红书笔记,含笔记正文、笔记链接、发布时间、转评赞藏等

一、背景介绍 1.1 爬取目标 熟悉我的小伙伴都了解&#xff0c;我之前开发过2款软件&#xff1a; 【GUI软件】小红书搜索结果批量采集&#xff0c;支持多个关键词同时抓取&#xff01; 【GUI软件】小红书详情数据批量采集&#xff0c;含笔记内容、转评赞藏等&#xff0c;支持…

视频剪辑达人分享:一键批量置入随机封面,创意无限

在数字化媒体飞速发展的今天&#xff0c;视频内容已经成为我们表达创意、分享故事、传递信息的主要方式之一。而在视频制作过程中&#xff0c;封面作为视频的“脸面”&#xff0c;往往决定了观众是否愿意点击观看。因此&#xff0c;为视频选择合适的封面变得至关重要。 在大量…

在M1芯片安装鸿蒙闪退解决方法

在M1芯片安装鸿蒙闪退解决方法 前言下载鸿蒙系统安装完成后&#xff0c;在M1 Macos14上打开闪退解决办法接下来就是按照提示一步一步安装。 前言 重新安装macos系统后&#xff0c;再次下载鸿蒙开发软件&#xff0c;竟然发现打不开。 下载鸿蒙系统 下载地址&#xff1a;http…

[机器学习-04] Scikit-Learn机器学习工具包进阶指南:集群化与校准功能实战【2024最新】

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…

【Git】Commit后进行事务回滚

起因 因为一直使用git add .&#xff0c;在学习pytorch中添加了一个较大的数据集后&#xff0c;导致git push失败&#xff0c;而这个大数据集并不是必须要上传到仓库的&#xff0c;但是因为自己在设置.gitignore前已经进行了git comit&#xff0c;所以&#xff0c;需要进行事务…

辅助驾驶激光雷达测试白板的重要性

随着自动驾驶技术的迅猛发展&#xff0c;辅助驾驶系统&#xff08;ADAS&#xff09;已成为现代汽车安全的重要组成部分。在这一系统中&#xff0c;激光雷达&#xff08;LiDAR&#xff09;扮演着至关重要的角色&#xff0c;它通过发射激光脉冲并接收反射回来的信号来检测车辆周围…

TCP的延时应答和捎带应答详解

一、延时应答 延时应答是指TCP接收方在接收到数据包后&#xff0c;并不立即发送确认&#xff08;ACK&#xff09;消息&#xff0c;而是等待一段时间&#xff0c;以期望在该时间段内收到更多的数据包&#xff0c;从而实现合并多个ACK消息为一个&#xff0c;减少网络中的确认消息…

企业网站从传统服务器迁移到弹性云有什么优势呢?

现代企业对于网站和应用程序的可用性和性能要求越来越高&#xff0c;传统基础设施可能无法满足这些需求。弹性云作为一种新兴的云计算服务模式&#xff0c;对于企业网站的运行和管理带来了许多优势。下面是企业网站从传统服务器迁移到弹性云的五大优势&#xff1a; 灵活弹性&a…

C语言(指针)4

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;关注收藏&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#x…

vue+sortablejs来实现列表拖拽——sortablejs的使用

sortablejs官网:https://sortablejs.com/ 最近在看form-builder组件&#xff0c;发现里面有用到sortablejs插件&#xff0c;用于实现拖拽效果。 但是这个官网中的配置&#xff0c;实在是看不懂&#xff0c;太简单又太复杂&#xff0c;不实用。 下面记录一下我的使用&#xff…

vue3属性透传(透传 Attributes),支持多个根节点,且可以在JavaScript 中访问透传 Attributes

支持多个根节点&#xff0c;且可以在JavaScript 中访问透传 Attributes Index.vue: <script setup> import { ref, onMounted } from vue import Child from ./Child.vue import ./index.cssconst handleClick () > {console.log(1) }onMounted(() > {}) </s…

地磁暴红色预警来袭,普通人该如何应对?绝绝子的防护指南来了

近日&#xff0c;国家空间天气监测预警中心发布了一则令人瞩目的消息——地磁暴红色预警。这一预警不仅提醒我们地磁暴即将影响我国的电离层和低轨卫星&#xff0c;更让我们深刻认识到地球空间环境的脆弱性和复杂性。对于普通公众而言&#xff0c;地磁暴的概念可能相对陌生&…

python代码实现xmind思维导图转换为excel功能

目录 转换前xmind示例 运行代码转换后excel示例 python代码 转换前xmind示例 运行代码转换后excel示例 如果想要合并单元格内容&#xff0c;在后面一列参考输入 B2&C2&D2&E2 python代码 from xmindparser import xmind_to_dict import pandas as pd from openp…

Linux——综合实验

要求 按照上面的架构部署一个简单的web节点所有的服务器使用DNS服务器作为自己的DNS服务器 就是/etc/reslov.conf 中nameserver的值必须是途中dns服务器的地址所有的数据库都是用mysql应用 nfs共享导出在客户端(web服务器上)使用autofs在自动挂载&#xff0c;或者写入/etc/fsta…

QT+网络调试助手+TCP服务器

一、UI界面设计 二、单线程 代码设计 1、 查找合法的本地地址&#xff0c;用于当作服务器的IP地址 #include <QThread> #include <QTcpSocket> #include <QNetworkInterface> #include <QMessageBox>QList<QHostAddress> ipAddressesList QNe…

车规级低功耗汽车用晶振SG-9101CGA

车规级晶振SG-9101CGA属于爱普生9101系列&#xff0c;是一款可编程晶振。SG-9101CGA车规级晶振采用2.5x2.0mm封装&#xff0c;利用PLL技术生产&#xff0c;此款振荡器的频率范围从0.67M~170MHZ任一频点可选&#xff0c;步进1ppm&#xff0c;采用标准CMOS输出&#xff0c;最大输…

决策树的学习(Decision Tree)

1.对于决策树的概念&#xff1a; **本质上&#xff1a;**决策树就是模拟树的结构基于 if-else的多层判断 2.目的&#xff1a; 对实例进行分类的树形结构&#xff0c;通过多层判断&#xff0c;将所提供的数据归纳为一种分类规则。 3.优点&#xff1a; 1.计算量小&#xff0c;…

【高阶数据结构】LRU Cache -- 详解

一、什么是 LRU Cache LRU&#xff08;Least Recently Used&#xff09;&#xff0c;意思是最近最少使用&#xff0c;它是一种 Cache 替换算法。 什么是 Cache&#xff1f; 狭义的 Cache 指的是位于 CPU 和主存间的快速 RAM&#xff0c;通常它不像系统主存那样使用 DRAM 技术&…

大模型微调之 在亚马逊AWS上实战LlaMA案例(八)

大模型微调之 在亚马逊AWS上实战LlaMA案例&#xff08;八&#xff09; 微调技术 Llama 等语言模型的大小超过 10 GB 甚至 100 GB。微调如此大的模型需要具有非常高的 CUDA 内存的实例。此外&#xff0c;由于模型的大小&#xff0c;训练这些模型可能会非常慢。因此&#xff0c…

HBase 读写流程

HBase 读写流程 1. 读流程 Client先访问zookeeper&#xff0c;从zookeeper获取meta region的位置从meta region中读取meta表中的数据&#xff0c;meta中存储了用户表的region信息&#xff1b;根据namespace、表名和rowkey在meta表中找到对应的region信息&#xff1b;找到这个r…