参考4h上手C++版Opencv_Bilibili

OpenCV版本:4.5.5

ColorPicker.cpp

//OpenCV版本:4.5.5
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;Mat imgHSV, mask, imgColor;
int hmin = 24, smin = 95, vmin = 105;
int hmax = 80, smax = 245, vmax = 255;
//24,95,105,80,245,255
VideoCapture cap(0);
Mat img;
int main()
{namedWindow("Trackbars", (640, 200));createTrackbar("Hue Min", "Trackbars", &hmin, 179);createTrackbar("Hue Max", "Trackbars", &hmax, 179);createTrackbar("Sat Min", "Trackbars", &smin, 255);createTrackbar("Sat Max", "Trackbars", &smax, 255);createTrackbar("Val Min", "Trackbars", &vmin, 255);createTrackbar("Val Max", "Trackbars", &vmax, 255);while (true){//cap.read(img);cap >> img;cvtColor(img, imgHSV, COLOR_BGR2HSV);Scalar lower(hmin, smin, vmin);Scalar upper(hmax, smax, vmax);inRange(imgHSV, lower, upper, mask);cout << hmin << "," << smin << "," << vmin << "," << hmax << "," << smax << "," << vmax << endl;imshow("Image", img);imshow("Mask", mask);waitKey(1);}
}

VisualPaint.cpp

//OpenCV版本:4.5.5
#include <opencv2\opencv.hpp>
#include<iostream>
#include<math.h>
using namespace cv;
using namespace std;//尽量在光照稳定的环境中运行此程序,背景最好是纯色并且与画笔的颜色差异较大
Mat img;
vector<vector<int>> newPoints;
//要检测的颜色(HSV模式)(顺序为hmin smin vmin hmax smax vmax)(通过ColorPicker.cpp手动调出范围)
//vector<vector<int>> myColors{ {21,105,125,55,230,230} };//黄色塑料壳固体胶的颜色
//140,65,110,195,150,195比较宽松的红色
vector<vector<int>> myColors{ {130,55,85,205,160,210} }; //更加宽松的红色
//要输出的颜色
vector<Scalar> myColorValues{ {0,0,255} };Point 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);//笔尖坐标int max = -1;//储存面积最大的区域的下标for (int i = 0; i < contours.size(); i++){if (contourArea(contours[i]) > 0){绘制边缘//float peri = arcLength(contours[i], true);//approxPolyDP(contours[i], conPoly[i], 0.01 * peri, true);//drawContours(img, conPoly, i, Scalar(255, 0, 255), 3);cout << conPoly[i].size() << endl;绘制矩形框//boundRect[i] = boundingRect(conPoly[i]);//rectangle(img, boundRect[i].tl(), boundRect[i].br(), Scalar(0, 255, 0));//找出面积最大的区域if (max != -1) {if (contourArea(contours[i]) > contourArea(contours[max]))max = i;}else max = i;}}if (max != -1){//绘制边缘float peri = arcLength(contours[max], true);approxPolyDP(contours[max], conPoly[max], 0.01 * peri, true);drawContours(img, conPoly, max, Scalar(255, 0, 255), 3);//cout << conPoly[i].size() << endl;//绘制矩形框boundRect[max] = boundingRect(conPoly[max]);rectangle(img, boundRect[max].tl(), boundRect[max].br(), Scalar(0, 255, 0));//获取面积最大的区域(视为笔尖)的坐标myPoint.x = boundRect[max].x + boundRect[max].width / 2;myPoint.y = boundRect[max].y;}return myPoint;
}vector<vector<int>> findColor(Mat img)
{Mat imgHSV;cvtColor(img, imgHSV, COLOR_BGR2HLS);int max = 0;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 });//将符合条件的笔尖坐标和相应颜色存入newPoints}}return newPoints;
}Point prepoint;//储存前一个点的坐标
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]), 5, myColorValues[newPoints[i][2]], FILLED);//用线段连接将前后相邻(指时间顺序的前后)且距离比较进的点连起来//由于本程序只识别一个颜色所以可以正常运行,若要识别多个颜色需要使用一组点,如vector<Point> prepoint;if (i >0&&sqrt((newPoints[i][0]-prepoint.x)* (newPoints[i][0] - prepoint.x)+ (newPoints[i][1] - prepoint.y) * (newPoints[i][1] - prepoint.y))<50)line(img, prepoint, Point(newPoints[i][0], newPoints[i][1]), myColorValues[newPoints[i][2]], 10);prepoint = Point(newPoints[i][0], newPoints[i][1]);}
}int main()
{//读取视频或摄像头VideoCapture capture(0);while (true){capture.read(img);//capture >> img;//newPoints = findColor(img);findColor(img);drawOnCanvas(newPoints,myColorValues);imshow("读取视频", img);waitKey(1);}return 0;
}

OpenCV虚拟画图程序(C++)相关推荐

  1. python画图程序没有图_解决python中使用plot画图,图不显示的问题

    解决python中使用plot画图,图不显示的问题 对以下数据画图结果图不显示,修改过程如下 df3 = {'chinese':109, 'American':88, 'German': 66, 'K ...

  2. 基于C++的画图程序

    (实验说明:本程序是在linux系统下编写编译的,没有Windows可执行文件,所以只能给出源码,但是经测试好像源码在windows系统下opencv库有一些问题,不能正常编译,所以只能在linux下 ...

  3. java画笔覆盖在界面_Java实现画图程序和重绘

    上次聊了一下事件监听机制,今天就来聊一下怎么实现一个画图程序并且实现重绘. 一.实现画图程序 1.实现一个画图程序所需的API类? JFrame窗体容器组件类 JPanel 面板元素组件类 JButt ...

  4. 87岁的老奶奶喜欢用windows画图程序作画,而且画得还贼好!

    来自:安说|搜集有趣的事 信息化时代,谁还不会点新技能呢? 你可能认为老年人很难跟上时代的步伐,比如说你的奶奶不会用智能手机,不会发微信,不会使用手机支付等等.但是事实是,他们可能并不是不会,而是不想 ...

  5. VDI序曲二十四 APP-V客户端安装及虚拟应用程序体验

    之前我们部署好了APP-V的服务器端和抓捕好了OFFICE2003的虚拟程序包,现在我们需要在客户端机器上安装APP-V客户端和体验之前做好的OFFICE 2003的虚拟程序 APP-V服务器端一旦发 ...

  6. python画图程序有图-python画图程序

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 今天做的是用python实现画图,画出你想要的图案,只要你的想象力足够丰富,以及 ...

  7. OpenCV计算机视觉应用程序的交互式视觉调试

    OpenCV计算机视觉应用程序的交互式视觉调试 计算机视觉应用程序的交互式视觉调试 目标 代码 解释 结果 计算机视觉应用程序的交互式视觉调试 调试计算机视觉应用程序的最常用方法是什么?通常,答案是临 ...

  8. OpenCV向应用程序添加跟踪栏

    OpenCV向应用程序添加跟踪栏 向应用程序添加跟踪栏 目标 代码 解释 向应用程序添加跟踪栏 目标 在本教程中,您将学习如何: 使用cv :: createTrackbar在OpenCV窗口中添加跟 ...

  9. VS中使用OpenCV构建应用程序

    VS中使用OpenCV构建应用程序 VS中使用OpenCV构建应用程序 前言 The local method本地方法 The global method全局的方法 测试一下! Visual Stud ...

最新文章

  1. linux日志idProduct,linux – 机器ID是uuid吗?
  2. R语言ggplot2可视化在图像边界内绘制geom_text文本标签实战
  3. 涡流探伤仪计算机软件,册亨通过式涡流探伤仪涡流探伤仪保养
  4. java记事本课程设计,java记事本课程设计
  5. 微软BUG Bounty悬赏项目扩展至.NET Core和ASP.NET Core
  6. 【2018.3.31】模拟赛之二-ssl2407 负进制【贪心】
  7. Confluence 6 自动添加用户到用户组
  8. lsass.exe 当试图更新密码时_“驱动人生”下载器木马再度更新-你应该注意什么?...
  9. 【Python】体育竞技分析
  10. 原创电子书:C#难点逐个击破
  11. html js格式化,Js/html格式化在线工具
  12. 【WiFi】WiFi信道(2.4G、5G及5G DFS)及国家码和电话代码和时区对应表
  13. 各大媒体优劣对比_各种媒体的优缺点分析()
  14. HIVE函数集合(全)
  15. matlab读lExcel文字,matlab读取excel文件及其数据处理
  16. python读取excel成绩表,并设置柱状图
  17. 一行Python代码去除照片背景
  18. Java 生成支付二维码返回给前端和自定义二维码背景色
  19. java 实现写出倒立三角形的几种方法
  20. 易基因|一文读懂精准简化基因组甲基化测序(RRBS+oxRRBS)分析怎么做

热门文章

  1. 巨坑系列:Java Bean 转 Map 的那些坑
  2. 用matlab实现理查森外推算法,Matlab数值积分(2)
  3. 为什么网上邻居 无法访问他人电脑?
  4. java的wait_java wait()方法用法详解
  5. 打印机不显示web服务器,HP打印机如何设置嵌入式Web服务器(EWS)的权限
  6. C语言内存管理机制精讲-高手必修课视频教程-黄强-专题视频课程
  7. Unity3D研究院之在Unity中打开第三方数据库配合Android开发(三十二)
  8. 产业园以商招商实施方案
  9. ps怎么抠图-ps怎么抠图换背景透明
  10. 高中计算机软件,高中信息技术计算机软件基础知识.ppt