OpenCV | 项目 | 虚拟绘画

embedded/2024/9/22 22:32:00/

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.ppmy.cn/embedded/34169.html

相关文章

Java面试题:并发编程中,什么是死锁,如何避免它?

什么是死锁&#xff1f; 死锁是指在多线程环境中&#xff0c;由于资源分配不当或进程运行顺序不合理&#xff0c;导致涉及的线程都处于等待状态&#xff0c;无法继续执行的一种状况。在Java中&#xff0c;死锁通常发生在多个线程互相等待对方持有的锁&#xff0c;但没有任何一…

gateway基本配置详解

Spring Cloud Gateway 是 Spring Cloud 的一个组件&#xff0c;它基于 WebFlux 框架&#xff0c;用于构建 API 网关。API 网关是微服务架构中的一个重要组件&#xff0c;它作为系统的入口&#xff0c;负责处理客户端请求&#xff0c;并将请求路由到相应的服务。以下是 Spring C…

【微服务】服务保护(通过Sentinel解决雪崩问题)

Sentinel解决雪崩问题 雪崩问题服务保护方案服务降级保护 服务保护技术SentinelFallback服务熔断 雪崩问题 在微服务调用链中如果有一个服务的问题导致整条链上的服务都不可用&#xff0c;称为雪崩 原因 微服务之间的相互调用&#xff0c;服务提供者出现故障服务的消费者没有…

解决网络ping不通问题

网络ping不通可能有多种原因&#xff0c;以下是一些常见的解决方法&#xff1a; 1. 检查IP地址和域名&#xff1a;确保你使用的是正确的IP地址或者域名来ping目标设备。如果IP地址或者域名错误&#xff0c;ping请求将无法到达目标设备。 2. 检查网络连接&#xff1a;首先确保…

Python | Leetcode Python题解之第62题不同路径

题目&#xff1a; 题解&#xff1a; class Solution:def uniquePaths(self, m: int, n: int) -> int:return comb(m n - 2, n - 1)

zookeeper启动后占用8080端口问题分析及解决

ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务。它为分布式应用提供一致性服务的软件&#xff0c;提供的功能包括&#xff1a;配置维护、域名服务、分布式同步、组服务等。 我们经常在运行zookeeper服务时&#xff0c;不需要配置服务端口&#xff0c;…

【AI+清除背景】假期旅行相册大升级——如何优雅移除照片中的不速之客

五一假期归来&#xff0c; 相信大家相册里都拍了不少热闹的景区打卡照吧。面对照片中的不速之客&#xff0c; 相信不同人有不同的清除背景方式。这里列一列我自己常用的方式 。 先说手机端。 我用的华为手机&#xff0c; 本身系统相册就自带消除功能。使用该功能的基本步骤很简…

Qt建立服务端和客户端

一. C语言中 1. 服务器端流程Server 1. 创建套接字--socket() 2.将套接字与其ip地址&#xff0c;端口号进行绑定--bind() 3. 将套接字设置成被动监听状态--listen() 2和3是Qt中的listen()&#xff0c;1&#xff0c;2和3实质就是把自己的信息固定下来&#xff0c;等待别人与之通…