认识画图函数

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc.hpp>
//#include<iostream>#define w 400using namespace cv;/*
大量使用 Point 和 Scalar 这两个结构:
Point数据结构表示了由其图像坐标 x 和 y 指定的2D点;
也可以用Point2f表示坐标由浮点数表示。Scalar是一个由长度为4的数组作为元素构成的结构体,Scalar最多可以存储四个值,没有提供的值默认是0;
此类型在OpenCV中被大量用于传递像素值,如用它来表示RGB颜色值(三个参数):
Scalar( a, b, c ),那么定义的RGB颜色值为: Red = c, Green = b and Blue = a
*/
/// Function Declaration
void MyEllipse(Mat img, double angle)
{int thickness = 2;int lineType = 8;//线形为8连通线型ellipse(img,Point(int(w / 2.0), int(w / 2.0)),//中心点Size(w / 4, w / 16),//大小angle,//椭圆旋转角度0,//扩展弧度起始点360,//终点Scalar(255, 0, 0), //使用Scalar类型数据设置colorthickness,lineType);
}
//void MyFilledCircle(Mat img, Point2f center);
void MyFilledCircle(Mat img, Point2f center)
{int thickness = -1; //封闭曲线,则要填充图像int lineType = 8;circle(img,center,w / 32,Scalar(0, 0, 255), //设置colorthickness,lineType);
}int main(int argc, char **argv)
{/// Windows nameschar atom_window[] = "Drawing 1: Atom";/// Create black empty images Mat atom_image = Mat::zeros(w, w, CV_8UC3); //创建Mat类的对象atom_image,使用Mat类的zeros方法//参数CV_8UC3表示unsigned 8 bits,3通道(Channels)/// 1. Draw a simple atom:/// -----------------------/// 1.a. Creating ellipses MyEllipse(atom_image, 90);MyEllipse(atom_image, 0);MyEllipse(atom_image, 45);MyEllipse(atom_image, -45);/// 1.b. Creating circlesMyFilledCircle(atom_image, Point2f(w / 2.0, w / 2.0));//PointF,由于这里(System.Drawing)的“点”设计用于屏幕显示用,//而屏幕显示以像素为单位,一般使用整数形式的Point就足够了/// 2. Display your stuff!imshow(atom_window, atom_image);imwrite("C:\\Users\\77607\\Desktop\\atom_image.jpg", atom_image);//需要将opencv*.dll拷贝一份放在和exe相同文件夹下waitKey(0);return(0);
}

使用鼠标当画笔画图

目标:

  1. 学习使用OpenCV处理鼠标事件
  2. 学习函数:cv::setMouseCallback()
 void setMousecallback(const string& winname, MouseCallback onMouse, void* userdata=0)winname:窗口的名字onMouse:鼠标响应函数,回调函数。指定窗口里每次鼠标时间发生的时候,被调用的函数指针。 这个函数的原型应该为void on_Mouse(int event, int x, int y, int flags, void* param);userdate:传给回调函数的参数
#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui_c.h>
#include<opencv2\opencv.hpp>
#include<opencv2\imgproc\imgproc.hpp>
using namespace cv;char *window_name = "image";
// mouse callback function
void draw_circle(int event, int x, int y, int flags, void* param);
int main()
{Mat img = Mat::zeros(512, 512, CV_8UC3);namedWindow(window_name);imshow(window_name, img);setMouseCallback(window_name, draw_circle, (void*)&img);while (1){if (cvWaitKey(20))break;}waitKey(0);return 0;
}
void draw_circle(int event, int x, int y, int flags, void* param)
{Mat depth_img = *(Mat*)param; // 先转换类型,再取数据if (event == CV_EVENT_LBUTTONDBLCLK)//位于highgui_c.h{circle(depth_img, cvPoint(x, y), 100, CV_RGB(0, 0, 255), -1);imshow(window_name, depth_img);}
}

可以通过鼠标输入改变绘图模式

#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui_c.h>
#include<opencv2\opencv.hpp>
#include<opencv2\imgproc\imgproc.hpp>
using namespace cv;char *window_name = "test";
bool mode = true;
void drawByMouse(int event, int x, int y, int flags, void *param);int main(int argc, char* argv[])
{Mat img = Mat::zeros(800, 600, CV_8UC3);namedWindow(window_name);imshow(window_name, img);setMouseCallback(window_name, drawByMouse, (void*)&img);while (1){//imshow(window_name, img);int k = cvWaitKey(1);if (k == 'm')mode = !mode;else if (k == 27)break;}waitKey(0);return 0;}void drawByMouse(int event, int x, int y, int flags, void *param)
{Mat depth_img = *(Mat*)param; // 先转换类型,再取数据static CvPoint point_start, point_end;static bool draw_flag = false;switch (event){case CV_EVENT_LBUTTONDOWN://位于highgui_c.h{draw_flag = true;point_start = cvPoint(x, y);break;}case CV_EVENT_LBUTTONUP:{draw_flag = false;break;}case CV_EVENT_MOUSEMOVE:{if (draw_flag == true)if (mode == true){point_end = cvPoint(x, y);rectangle(depth_img, point_start, point_end, CV_RGB(0, 255, 0), -1);imshow(window_name, depth_img);}else{circle(depth_img, cvPoint(x, y), 3, CV_RGB(0, 0, 255), -1);imshow(window_name, depth_img);}}}
}

生产非填充的矩形

//#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui_c.h>
//#include<opencv2\imgproc\imgproc.hpp>
#include<opencv2\opencv.hpp>
#include<iostream>using namespace cv;
#define WINDOW_NAME "【程序窗口】"        //为窗口标题定义的宏
//c和c++中允许用一个标识符来表示一个字符串,称为“宏”/*****************鼠标操作*****************/
Rect g_rect;
//Recg类用于创建一个矩形对象,矩形左上角的横坐标、纵坐标以及矩形的宽度、高度均为零。
bool g_DrawFlag = false;
RNG g_rng(12345);
//RNG类是opencv里C++的随机数产生器。它可产生一个64位的int随机数。
//RNG可以产生3种随机数
//RNG(int seed)         使用种子seed产生一个64位随机整数,默认 - 1
//计算机产生的随机数都是伪随机数,是根据种子seed和特定算法计算出来的。
//所以,只要种子一定,算法一定,产生的随机数是相同的
//RNG::uniform()      产生一个均匀分布的随机数
//RNG::gaussian()    产生一个高斯分布的随机数
void on_MouseHandle(int event, int x, int y, int flag, void* param);
void DrawRectangle(Mat& img, Rect box);
void main()
{//准备参数g_rect = Rect(-1, -1, 0, 0);Mat srcImage(600, 600, CV_8UC3), tempImage;srcImage.copyTo(tempImage);//image.copyTo(imageROI)。作用是把image的内容复制粘贴到imageROI上//g_rect = Rect(-1, -1, 0, 0);srcImage = Scalar::all(0);//设置鼠标操作回调函数namedWindow(WINDOW_NAME);setMouseCallback(WINDOW_NAME, on_MouseHandle, (void*)&srcImage);//绘画while (1){srcImage.copyTo(tempImage);if (g_DrawFlag) {DrawRectangle(tempImage, g_rect);}imshow(WINDOW_NAME, tempImage);if (waitKey(10) == 27) break;//ESC 退出}
}
//鼠标回调事件
void on_MouseHandle(int event, int x, int y, int flag, void* param)
{Mat& image = *(Mat*)param;switch (event){case EVENT_MOUSEMOVE://移动if (g_DrawFlag) {//计算,g_rect宽高=鼠标当前位置坐标-g_rect左上角的坐标g_rect.width = x - g_rect.x;g_rect.height = y - g_rect.y;}break;case EVENT_LBUTTONDOWN://左键按下g_DrawFlag = true;//设置g_rect的初始值在同一个点g_rect = Rect(x, y, 0, 0);break;case EVENT_LBUTTONUP://左键抬起//在画填充矩形的程序中,鼠标移动时开始画,非填充矩形是左键抬起开始画g_DrawFlag = false;//当g_rect宽高小于0//起始点xy坐标置为较小靠左上角的点//宽高取绝对值if (g_rect.width < 0) {g_rect.x += g_rect.width;g_rect.width *= -1;}if (g_rect.height < 0) {g_rect.y += g_rect.height;g_rect.height *= -1;}//画矩形DrawRectangle(image, g_rect);break;}
}
//矩形绘制函数
void DrawRectangle(Mat& img, Rect box)
{//rectangle画矩形//tl左上角的点,br右下角的点//Scalar设置颜色,设置为3通道//g_rng.uniform(0, 255)随机颜色rectangle(img, box.tl(), box.br(), Scalar(g_rng.uniform(0, 255),g_rng.uniform(0, 255), g_rng.uniform(0, 255)));//box.tl();       //返回box的左上顶点的坐标//box.br();       //返回box的右下顶点的坐标
}

opencv画图_c++相关推荐

  1. Python | OpenCV画图显示为一个全黑画布的情况

    问题 之前写过一个博客:Python | 关于OpenCV和plt画图中数据类型不为unit8的问题 介绍当OpenCV和plt画图不为uint8的时候,怎么转换为Uint8. 但是之前只知道应该转换 ...

  2. Opencv画图函数整理 及 cvCircle cvLine 只能画出黑白两种颜色问题 解决

    一句话:用这些画图函数在RGB图上画,则能画出来彩色. 如果您在灰度图上画 则无论怎么设置color都只能画出黑白两种颜色. 就这一句话搞了我一个晚上,惭愧! Opencv绘图函数:http://ww ...

  3. OpenCV画图函数

    1. 线 函数 #include <opencv2/imgproc.hpp>void cv::line(InputOutputArray img,Point pt1,Point pt2,c ...

  4. 3 用python进行OpenCV实战之画图(直线,矩形,圆形)

    前言 在上一节我们通过使用NumPy的数组分割成功的在我们的图像上画了一个绿色的方块,但是如果我们想画一个单一的线条或者圆圈该怎么办呢?NumPy没有提供相关的功能,但是OpenCV提供了相关的函数, ...

  5. Opencv 入门篇学习记录(图片)

    title: Opencv 入门篇学习记录(图片) Opencv 入门篇学习记录(图片) 前言 很早以前就接触Python了,大学的时候还自学了一段时间去做了课设,写了一些最速梯度下降法.黄金分割法. ...

  6. openCV(贾志刚视频)笔记

    openCV笔记 一,图像编程入门 图像的读取和写入 调用读取函数imread() image=cv::imread("文件路径"); 要用一个变量来接收文件路径 文件路径要使用\ ...

  7. OpenCV实现人脸检测和68点定位

    人脸对比是现在比较常用的功能,比如出租车司机人脸与司机驾照照片对比,门禁系统中进入者的人脸与人脸库中的人脸进行对比.要实现人脸对比,首先要实现的是人脸检测,在摄像头拍摄到的一张图片中,正确的检测到人脸 ...

  8. 3皮卡丘眨眼代码_眨眼检测调研以及活体检测应用

    眨眼作为一种无意识的生物特征,一般健康人眨眼间隔2s至10s,眼睛闭合持续时间100ms至400ms.利用健康人的眨眼频率特点,主要应用于疲劳检测和活体检测等两个场景.对于疲劳检测场景,疲劳特点是频繁 ...

  9. 拉格朗日插值编程实现

    拉格朗日插值原理: 拉格朗日插值的具体介绍网址:https://zh.wikipedia.org/wiki/%E6%8B%89%E6%A0%BC%E6%9C%97%E6%97%A5%E6%8F%92% ...

最新文章

  1. 利用SAP FR高效预测客户需求
  2. 关于base target=_self 等
  3. zookeeper 启动显示started,jps查看进程却没有,解决方法
  4. jQuery拼接页面元素
  5. 关于.NET 的网络信息,服务器端与用户端的信息
  6. [Reomting Debug] 巧用VS 的remote debug 功能远程调试程序 经验分享.
  7. [转载]文本特征TFIDF权重计算及文本向量空间VSM表示
  8. c语言程序设计教程赵乘,《C语言程序设计教程》例题源码.pdf
  9. dataAdapter与dataSet和dataTable的填充
  10. 1041. Robot Bounded In Circle
  11. 手机看直播时卡屏幕显示无法连接服务器,看直播不再卡!教你几招提升网速方法...
  12. python基于协程的网络库gevent、eventlet
  13. SteamAchievementManager刷steam游戏成就新手教程
  14. Elasticsearch.service failed after enable elasticsearch security features
  15. 根据时间段自动调节pulseaudio音量
  16. randn函数加噪声_Matlab笔记——AWGN函数详解与实例——AWGN加性高斯白噪声+QPSK调制...
  17. Kube-OVN:大型银行技术团队推荐的金融级云原生网络方案
  18. Pegasus读取传感器AD的值
  19. Ubuntu 20.04 Micosoft edg 浏览器安装教程
  20. 一场胆战心惊的B站面试,哔哩哔哩也太难进了

热门文章

  1. python odoo_odoo python 使用缓存
  2. 知乎搜索框背后的Query理解和语义召回技术
  3. 手把手教你成为年薪60万的架构师
  4. 领域应用 | 2020 年中国知识图谱行业分析报告
  5. 使网页成黑白色调的滤镜(转)
  6. springCloud(微服务的概念)1-1
  7. MongoDB limit 选取 skip跳过 sort排序 方法
  8. DevExpress破解和消除弹出框问题
  9. C#穿透session隔离———Windows服务启动UI交互程序
  10. copy a random link