opencv画图_c++

认识画图函数

#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的右下顶点的坐标 
}

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

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

相关文章

3月任务--target

2014过去了&#xff0c; 在再过4周左右&#xff0c; 就是在WACAI呆了一周年了。 经过这一年&#xff0c;我想我的成长是有的&#xff0c; 尤其是经过“话费账单”这个项目&#xff0c; 不过有喜有忧&#xff0c; 也许就和他们说的一样&#xff0c; 是我不容易满足吧。 都说知足…

史上最全的物理学科普(值得收藏)

来源&#xff1a;中科院物理所&#xff08;ID&#xff1a;cas-iop&#xff09;本文素材主要摘录自加来道雄的《Hypersapce》和丘成桐的《The Shape of Inner Space》。作者希望凭籍本文&#xff0c;回顾一下两百年来的科学史&#xff0c;看看那些代表着人类最高心智的数学家、物…

c++入门1

工具 NotepadVS 2015开发人员命令提示符 特点轻量化&#xff0c;Notepad可以写源代码&#xff0c;在VS 2015开发人员命令提示符可以进行编译、运行。 cd xxxxxx //进入源文件所在目录 cl xxx.cpp //在VS 2015开发人员命令提示符中编译源代码 xxx.exe //运行编译后的可执行文…

Redis数据存储解决方案

http://www.tuicool.com/articles/77nUZn 1、背景 1.1 Redis简介 官方网站&#xff1a; http://redis.io/ &#xff0c;Redis是REmote DIctionary Server的缩写。 Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并…

量子通信是不是伪科学?潘建伟这样回应

来源&#xff1a;科技日报“墨子号”发射快三年了&#xff0c;到底有什么新发现&#xff1f;量子通信和公众有什么关联&#xff0c;到底是不是伪科学&#xff1f;10日&#xff0c;在全国政协十三届二次会议举行的记者会上&#xff0c;全国政协委员、中国科学技术大学常务副校长…

AI如何设计,才能人类利益最大化?

来源&#xff1a;国机智能机器人曾为现代互联网早期协议和架构设计做出贡献的Vint Cerf&#xff0c;用一个寓言来解释为什么在人工智能等新兴技术出现后&#xff0c;勇敢的领导力至关重要。想象一下&#xff0c;你住在一个被群山环绕的山谷底部的小社区里。在远处的山顶上有一块…

每天收获

每天至少看一个demo代码&#xff0c;并且每天试着写出自己的demo。不能完全靠网上的代码蒙骗自己。 转载于:https://www.cnblogs.com/happywangjia/p/4319387.html

编译 | 5G时代的游戏世界:一年后的AR与VR将会发生的几个变化

来源&#xff1a;spectrum5G已不再是研发中的技术&#xff0c;它已经离我们非常的近&#xff0c;全球许多运营商都在都在部署这一新技术。那么我们可以从这个新一代无线系统中得到什么&#xff1f;不只是更好的智能手机服务。许多公司&#xff0c;比如德国电信&#xff0c;诺基…

《麻省理工科技评论》发布“21世纪迄今十大最糟科技”

来源&#xff1a;网络大数据必须承认&#xff0c;人类总会犯错&#xff0c;在科技的发展上也是一样。所以&#xff0c;当最新一期的《麻省理工科技评论》评出今天这份“ 2000-2019 年糟糕科技清单”时&#xff0c;你千万不要以为这是一件容易的事情。如果某项科技没有达到让人欣…

javascript Array对象

一&#xff0c;创建数组对象 JavaScript的数组支持了对任何数据类型的支持&#xff0c;并不会像java&#xff0c;C#那样指定了数组类型只能存储这种类型。 我们可以使用以下三种方法来创建JavaScript数组对象&#xff0c; 1&#xff0c;var arrnew Array(); 2 , var arrnew Arr…

67 亿美金搞个图,创建知识图谱的成本有多高你知道吗?

来源&#xff1a;算法与数学之美摘要&#xff1a;我们知道强大的深度模型需要很多计算力&#xff0c;那你知道创建一个知识图谱的成本到底是多少吗&#xff1f;德国 Mannheim 大学的研究者最近仔细估算了各种知识图谱每创建一条记录所需要的成本&#xff0c;他们表示对于大型知…

怎样修改MFC中应用程序标题的图标?

一、单文档中修改程序标题的图标 1. 切换到ResourceView视图&#xff0c;右键点击Icon&#xff0c;选择“import” ,导入图标(.ico)文件 2. 在CMainFrame中的OnCreate()函数中添加如下代码&#xff1a; //设置标题栏的图标 HICON m_hIcon AfxGetApp()->LoadIcon(IDI_ICON…

黄仁勋的“数据梦” 英伟达豪掷69亿美金虎口夺食

来源 &#xff1a; Bloomberg 编译&#xff1a;网易智能 晗冰3月12日消息&#xff0c;据国外媒体报道&#xff0c; 图形图像芯片制造商英伟达同意斥资69亿美元收购芯片制造商Mellanox&#xff0c;其欲通过此举大举进军不断增长的数据中心芯片市场。据悉&#xff0c;英伟达对Mel…

MFC制作简易音乐播放器

// MFC音乐播放器Dlg.cpp : implementation file // #include "stdafx.h" #include "MFC音乐播放器.h" #include "MFC音乐播放器Dlg.h" #include "Mmsystem.h" #include "Digitalv.h" #pragma comment(lib,"Winmm.lib&…

即使达到5级自动驾驶阶段,自动驾驶“卡车”也不可能完全“无人”

来源&#xff1a;IEEE编译&#xff1a;大数据文摘 李雷、周素云感谢Waymo和Uber等创业公司&#xff0c;让我们知道了无人驾驶汽车是怎么回事。这些汽车或卡车上配备了大量的传感器&#xff0c;并且依靠强大的计算能力使人们可以放心乘坐。愿景是美好的&#xff0c;但是却忽视了…

iOS 两种方法实现左右滑动出现侧边菜单栏 slide view

现在很多的APP中都有slide view&#xff0c;左右滑动出现侧边菜单栏的功能&#xff0c;Weico这个应用就有。网上有很多第三方的类库实现了这种效果&#xff0c;其实自己代码写的话也是很简单的&#xff0c;下面我将介绍两种方法实现slide view。---- 一种是用第三方类库IIViewD…

MFC中如何给对话框添加背景图片

定位到 void CXXXDlg::OnPaint()&#xff0c;在if()...else()中的else()下添加如下代码&#xff1a; else { //CDialog::OnPaint();//要禁止这个调用 CPaintDC dc(this); CRect rect; GetClientRect(&rect); CDC dcMem; dcMem.CreateCompatibleDC(&am…

孙正义万字访谈:AI是我现在唯一关注的事情,我是科技的绝对信徒

来源&#xff1a;腾讯科技科技变革丝毫没有减速&#xff0c;自动化就是科技的终极使命&#xff01;这是孙正义在最新采访中再次强调的理念。在接受CNBC超长采访中&#xff0c;软银创始人、千亿美元愿景基金掌舵者一再表示&#xff0c;AI能解决人类无法解决的问题&#xff0c;未…

Oracle 直方图理论

一.何为直方图 直方图是一种几何形图表&#xff0c;它是根据从生产过程中收集来的质量数据分布情况&#xff0c;画成以组距为底边、以频数为高度的一系列连接起来的直方型矩形图&#xff0c;如图所示 二.ORACLE 直方图 在Oracle中直方图是一种对数据分布情况进行描述的工具。它…

怎样把MySQL的编码方式改为utf8?

一、当我们安装好MySQL后&#xff0c;单击电脑开始&#xff0c;然后运行cmd&#xff0c;记得必须要用管理员的身份运行。然后输入net start mysql 前面操作如果忘记采用管理员身份运行的话&#xff0c;会出现系统访问错误。 二、修改MySQL的编码方式为utf8 1、找到默认MySQL的安…