《学习OpenCV》练习题第四章第五题a

opencv学习(九)图像绘制DrawEllipse/ Drawpolygon/ DrawFilledCircle/ DrawFilledCircle/ Rectangle(无法识别标识符,待解 DrawEllipse绘制椭圆函数用法 void DrawEllipse(Mat img,double angle) { int thickness=2; int lineType = 8; ellipse(img, Point(window_width / 2, window_width / 2), Size(window_... 阅读详情
#include "opencv_libs.h"
#include <highgui.h>
#include <cv.h>
#include <math.h>


/*
 *《学习OpenCV》第四章第五题a
 * 完成时间:8:08 4/5 星期五 2013
 */

#define IMG_WIDTH 512    // 图像宽
#define IMG_HEIGHT 512   // 图像高

#define RAND_INT_MAX 256

// 不同模式的定义
#define MODE_LINE     1     // 画线
#define MODE_CIRCLE   2     // 画圆
#define MODE_ELLIPSE  3     // 画椭圆
#define MODE_POLYGON  4     // 画多边形

// 当前模式
int g_draw_mode = 0;

typedef struct MyPoints
{
	CvPoint point;
	struct MyPoints* next;
} myPoints;

IplImage * image;
IplImage * temp;

// 随机数产生器
CvRNG rng = cvRNG(cvGetTickCount()); 

// 是否在画线
bool drawing_line = false;
// 画线--起点、终点
CvPoint g_Line_startpoint = cvPoint(-1, -1);
CvPoint g_Line_endpoint = cvPoint(-1, -1);

// 是否在画圆
bool drawing_circle = false;
// 画圆--圆心、半径
CvPoint g_Circle_center = cvPoint(-1, -1);
int g_Circle_radius = -1;

// 是否在画椭圆
bool drawing_ellipse = false;
// 画椭圆--圆心、长短半轴
CvPoint g_ellipse_center = cvPoint(-1, -1);
CvSize g_ellipse_axes = cvSize( -1, -1 );

// 是否在画多边形
bool drawing_polygon = false;
// 画多边形--所有点的数据
CvPoint** g_polygon_pts = (CvPoint**)malloc(sizeof(CvPoint*));
int* g_polygon_npts;
myPoints* pHead, *pTail, *pCurr;
int iNumofPoints = 0;

// 生成随机颜色
CvScalar getRandColor()
{
	return cvScalar( (cvRandInt(&rng) % RAND_INT_MAX),
		(cvRandInt(&rng) % RAND_INT_MAX ),
		(cvRandInt(&rng) % RAND_INT_MAX ));
}

// 画直线函数
void draw_line(IplImage * img)
{
	if(g_Line_endpoint.x == -1)
		return;
	CvScalar value = getRandColor();
	cvLine( img, g_Line_startpoint, g_Line_endpoint, value, 2);
}

// 画圆函数
void draw_circle(IplImage * img)
{
	if(g_Circle_radius == -1)
		return;
	CvScalar value = getRandColor();
	cvCircle( img, g_Circle_center, g_Circle_radius, value, 2 );
}

// 画椭圆函数
void draw_ellipse(IplImage* img)
{
	if(g_ellipse_center.x == -1)
		return;
	CvScalar value = getRandColor();
	cvEllipse( img, g_ellipse_center, g_ellipse_axes, 0, 0, 360, value, 2 );
}

// 画多边形函数
void draw_polygon(IplImage * img)
{
	CvScalar value = getRandColor();
	if(iNumofPoints == 0)
		return;

	// 遍历链表,取出point
	myPoints* p;
	int count = 0;
	
	printf("%d\t", iNumofPoints);
	g_polygon_pts[0] = (CvPoint*)malloc( sizeof(CvPoint) * iNumofPoints );
	for(p = pHead; p != NULL; p = p->next, count++)
	{
		g_polygon_pts[0][count] = p->point;
		printf("(%d, %d)  ",  p->point.x, p->point.y);
	}
	printf("\n");
	if(g_polygon_npts == NULL)
	{
		g_polygon_npts = (int*)malloc(sizeof(int));
	}
	g_polygon_npts[0] = iNumofPoints;
	cvPolyLine( img, g_polygon_pts, g_polygon_npts, 1, 0, value, 2 );
}

// 得到两点之间的距离
double getDistanceof2Points(CvPoint pt1, CvPoint pt2)
{
	double d = sqrt( pow( pt1.x - pt2.x, 2 ) + pow( pt1.y - pt2.y, 2 ) );
	return d;
}

// 鼠标事件回调函数
void my_mouse_callback(int event, int x, int y, int flags, void* param )
{
	IplImage * image = (IplImage * )param;

	switch(event)
	{
		// 鼠标左键按下
	case CV_EVENT_LBUTTONDOWN:
		// 不同模式的选择
		switch(g_draw_mode)
		{
			// 画线模式
		case MODE_LINE:
			drawing_line = true;
			g_Line_startpoint = cvPoint( x, y );
			break;
			// 画圆模式
		case MODE_CIRCLE:
			drawing_circle = true;
			g_Circle_center = cvPoint(x, y);
			break;
			// 画椭圆模式
		case MODE_ELLIPSE:
			drawing_ellipse = true;
			g_ellipse_center = cvPoint(x, y);
			break;
			// 画多边形模式
		case MODE_POLYGON:
			drawing_polygon = true;

			// 构造当前点
			myPoints* pNew;
			pNew = (myPoints*)malloc(sizeof(myPoints));
			pNew->point = cvPoint(x, y);
			pNew->next = NULL;
			// 链表为空
			if( pHead == NULL )
			{
				pHead = pNew;
				pTail = pNew;
			}
			// 链表不空
			else
			{
				pTail->next = pNew;
				pTail = pNew;
			}
			iNumofPoints++;
			break;
		}

		// 鼠标移动
	case CV_EVENT_MOUSEMOVE:
		switch(g_draw_mode)
		{
			// 画线模式
		case MODE_LINE:
			if(drawing_line)
			{
				g_Line_endpoint = cvPoint(x, y);
			}
			break;
			// 画圆模式
		case  MODE_CIRCLE:
			if(drawing_circle)
			{
				g_Circle_radius = getDistanceof2Points( 
					g_Circle_center, cvPoint( x, y ) );
			}
			break;			
			// 画椭圆模式
		case MODE_ELLIPSE:
			if(drawing_ellipse)
			{
				g_ellipse_axes = cvSize( 
					abs( x - g_ellipse_center.x ), 
					abs( y - g_ellipse_center.y ) );
			}
			break;
		}
		break;
	case CV_EVENT_LBUTTONUP:
		switch(g_draw_mode)
		{
			// 画线模式
		case MODE_LINE:
			drawing_line = false;
			draw_line( image );
			g_Line_endpoint = cvPoint(-1, -1);
			break;
			// 画圆模式
		case MODE_CIRCLE:
			drawing_circle = false;
			draw_circle( image );
			g_Circle_radius = -1;
			break;
			// 画椭圆模式
		case MODE_ELLIPSE:
			drawing_ellipse = false;
			draw_ellipse( image );
			g_ellipse_center = cvPoint(-1, -1);
			break;
		}
		break;
		// 右键按下,清除所有图像
	case CV_EVENT_RBUTTONDOWN:
		{
			printf("清除所有图像.\n");
			cvZero( image );

			// 画多边形模式,额外的处理
			if(g_draw_mode == MODE_POLYGON)
			{
				g_polygon_pts[0] = NULL;
				iNumofPoints = 0;
				pHead = pTail = NULL;
				g_polygon_npts = NULL;
			}
		}
		break;
	}
}

int main()
{
	// 8位3通道图像
	image = cvCreateImage( cvSize( IMG_WIDTH, IMG_HEIGHT ), 
		IPL_DEPTH_8U, 3 );
	// 置零
	cvZero(image);
	
	temp = cvCloneImage( image );

	// 创建窗口并设置鼠标事件回调函数
	cvNamedWindow("Drawing");
	cvSetMouseCallback("Drawing", my_mouse_callback, (void*) image );

	while(1)
	{
		cvCopyImage( image, temp );

		switch(g_draw_mode)
		{
			// 画线模式
		case MODE_LINE:
			if(drawing_line)
				draw_line( temp );
			break;
			// 画圆模式
		case MODE_CIRCLE:
			if(drawing_circle)
				draw_circle( temp );
			break;
			// 画椭圆模式
		case MODE_ELLIPSE:
			if(drawing_ellipse)
				draw_ellipse( temp );
			break;
			// 画多边形模式
		case MODE_POLYGON:
			if(drawing_polygon)
				draw_polygon( temp );
			break;
		}
		cvShowImage("Drawing", temp);

		// Esc键退出
		// 对于不同的按键,画不同的图形(线、圆、椭圆、多边形)
		int choose = cvWaitKey(15);
		switch(choose)
		{
			// l-108 L-76
		case 76:
		case 108:
			printf("当前处于画线模式.\n");
			g_draw_mode = MODE_LINE;
			break;
			// c-99 C-67
		case 67:
		case 99:
			printf("当前处于画圆模式.\n");
			g_draw_mode = MODE_CIRCLE;
			break;
			// e-101 E-69
		case 69:
		case 101:
			printf("当前处于画椭圆模式.\n");
			g_draw_mode = MODE_ELLIPSE;
			break;
			// p-112 P-80
		case 80:
		case 112:
			printf("当前处于画多边形模式.\n");
			g_draw_mode = MODE_POLYGON;
			break;
			// Esc 退出
		case 27:
			goto end;
		}
	}

	end:
	// 释放资源
	cvReleaseImage( &image );
	cvReleaseImage( &temp );
	cvDestroyAllWindows();

	return 0;
}

运行结果:

画线:


画圆:


画椭圆:


画多边形:



不足:在画多边形的时候未实现结束画多边形,即如果开始结束点不一样的话无法形成一个封闭的多边形。且只能画一个多边形。

《学习OpenCV》练习题第四章第六题 #include #include "opencv_libs.h" #include #define IMG_WIDTH 512 #define IMG_HEIGHT 512 /* *《学习OpenCV》第四章第六题 * 完成时间:9:32 4/5 星期五 2013 */ CvFont font; char *display_text = "|"; // 阅读详情

相关推荐

《学习OpenCV》练习题第二章第五题

#include #include #pragma comment (lib,"opencv_calib3d231d.lib") #pragma comment (lib,"opencv_contrib231d.lib") #pragma comment (lib,"opencv_core231d.lib") #pragma comment (lib,"opencv_features2d23

qdsclove的专栏 1444

《学习opencv》第四章第五题

创建一个图像,模仿画图软件可以用鼠标在上面画各种图形,滑动条选择不同颜色。(原题是逻辑画图) 源代码参考http://blog.sina.com.cn/s/blog_6c7395170100zl5x.html   #include "stdafx.h" #include "cv.h" #include "highgui.h" #include &lt;math.h&gt; //各种功能的...

不积跬步无以至千里 367

学习opencv3--第五章答案

1. #include <opencv2/opencv.hpp> #include <iostream> using namespace std; int main() { cv::Mat m(100, 100, CV_8UC3); m = 0; //画个圆 cv::circle(m, cv::Point(50, 50), 20, cv::Scalar(25...

huqiaolong的博客 680

《学习opencv》第四章第三题(全)

忙完了期末考试,继续学习opencv~ 这题考察了很多知识,知识点在我前面的练习中都有讲解。主要思路就是将三通道图分成单通道单个处理,最后将三个图拼在一起显示。 在释放内存的时候要细心,我总是在上面栽跟头,多调试调试吧!     #include "stdafx.h" #include&lt;highgui.h&gt; #include&lt;cv.h&gt; #include&lt;s...

不积跬步无以至千里 759

学习opencv3中文版--第四章答案

1. /* 本程序只实现了a和b,读者可自行实现c和d */ #include <opencv2/opencv.hpp> #include <iostream> using namespace std; const int display_height = 500; const int display_weight = 500; vector<cv::Mat1...

huqiaolong的博客 1307

《学习OpenCV》第四章练习题4

#include<iostream> #include"highgui.h" #include"cv.h" using namespace std; using namespace cv;CvRect rect; IplImage* test = cvLoadImage("test.jpg"); IplImage* test1 = cvCreateImage(cvSize(test->width,

Goods222的博客 460

《学习OpenCV》第四章第5题

创建一个程序,可以新建一个图像,并将图像所有像素值设置为0,然后将其显示出来。允许用户通过鼠标左键画线、矩形、圆、椭圆以及多边形。并使其能在右击鼠标时,实现橡皮擦功能。#include<iostream> #include"highgui.h" #include"cv.h" using namespace std; using namespace cv; #define WIDTH 512 #def

Goods222的博客 414

学习opencv3中文版--第三章练习题答案

1. #include<opencv2/opencv.hpp> using namespace std; int main() { /* a.选择一个负的浮点数 b.计算它的绝对值,近似,向上取整,向下取整 */ //生成一个负的浮点数 Cv32suf f; f.f = -2.3; cout <<"负的浮点...

huqiaolong的博客 1957

学习OpenCV第四章第五题答案

本答案只实现了画矩形和点击右键

想你时你在天边 632

《学习OpenCV》练习题第二章第三题

#include #include #pragma comment (lib,"opencv_calib3d231d.lib") #pragma comment (lib,"opencv_contrib231d.lib") #pragma comment (lib,"opencv_core231d.lib") #pragma comment (lib,"opencv_features2d23

qdsclove的专栏 1565

UCIe物理层 —— 逻辑协议 (2)

本章开始主要介绍UCIe协议第四章,物理层逻辑定义和规范。如其他的通信协议一样,接口的物理层包含两个部分,逻辑子层和电气子层。其中逻辑层主要负责:1.定义接口信号和时序2. 定义发送端如何将上层数据分发到各个物理通道以及接收端如何把从各个通道收到的数据恢复成byte stream(Flit)。3. Broken Lane的repair和remap。4. 链路初始化,训练(training)和电源状态管理/切换。5. 扰码Scrambling和training sequence的产生。

m0_47581558的博客 1477

《学习OpenCV》练习题第四章第一题a

#include #include #pragma comment (lib,"opencv_calib3d231d.lib") #pragma comment (lib,"opencv_contrib231d.lib") #pragma comment (lib,"opencv_core231d.lib") #pragma comment (lib,"opencv_features2d23

qdsclove的专栏 1529

绿联NAS使用docker部署immich【pro系统】

随后去绿联你想要存放immich的地方创建一个文件夹,便于区分,如图,我创建了一个immich的文件夹。1.进入文件夹后面是有斜杠的(tips:只需要敲击前面几个字母,按tab键自动补全)cd:进入路径,1.可以是当前的下一层相对路径 2.也可以是完整的全路径。前言:好像没有绿联的教程,刚好自己也有需求,就顺便记录了。如果你的挂载实战情况比较复杂,接下来是喂到胃里的知识点。】下载文件(群晖的,别慌,能用),两份,红框的就是。首先,没什么好说的,去immich官网【点击1.终端,2.新增,3.确定。

weixin_45343644的博客 1778

《学习OpenCV》练习题第三章第五题

#include #include #include #pragma comment (lib,"opencv_calib3d231d.lib") #pragma comment (lib,"opencv_contrib231d.lib") #pragma comment (lib,"opencv_core231d.lib") #pragma comment (lib,"opencv_fe

qdsclove的专栏 1348

门信号表达式_毫米波FMCW体制雷达的信号处理中的FFT等效为相干积累的解释

民用的77G或24G毫米波雷达目前普遍采用发射波形为一连串线性调频连续波(即所谓chirp信号,啁啾信号,线性调频波如果能够下变频到人耳可接收的频段,听起来很类似“啁啾”“啁啾”的鸟叫声)。一串前后相继的chirp信号与一段长时间的“空闲”组成一帧信号(比如汽车雷达整机厂普遍采用一帧为50ms)。用频谱仪观察chirp信号串,横坐标为时间,纵坐标为频率,如下图所示(此处引用TI产品手册...

weixin_39725756的博客 1949

GmSSL国密双证书实战:从生成到Nginx配置全流程

本文详细介绍了使用GmSSL工具生成国密双证书(签名证书与加密证书)并配置Nginx支持国密HTTPS(TLCP协议)的全流程。内容涵盖环境准备、自签CA创建、服务器双证书生成、Nginx单向/双向认证配置以及兼容性处理,为部署符合国密标准的HTTPS服务提供实战指南。

weixin_29276847的博客 479

《学习OpenCV》练习题第四章第四题

#include #include #include "opencv_libs.h" /* *《学习OpenCV》第四章第四题 * 完成时间:1:36 3/31 星期日 2013 */ int g_slider_position = 0; CvCapture* g_capture = NULL; int i = 0; int g_slider_position1 = 0; bool

qdsclove的专栏 1187

【电磁场与电磁波课程设计】基于HFSS的双频微带天线仿真及设计

第五代移动通信技术(5G)的商用已经近在眼前,作为移动通信中最为重要的功能组件,面向5G通信应用的手机天线与基站天线的技术研究与设计成为近年来的热点。随着移动通信中“跳频”“扩频”等通信技术发展,为了满足与多个终端的通信要求,实现多系统共用和收发共用等功能,这就要求天线在不同频段下工作。根据国家工信部的最新规定,5G移动通信的中频段被划定在3.3 GHz-3.5 GHz及4.8 GHz-5.0 GH,面向5G移动通信的天线应具有高增益、小型化、宽频段及高隔离度等技术特征,以满足5G通信的高传输速率、波束智能

weixin_44450575的博客 1万+

《学习OpenCV》练习题第四章第七题abc

题外话:一直是打算把这本书的全部课后编程题写完的,中间断了几个月,一直忙于其他事。现在开始补上。 这道题我不清楚我理解的题意是不是正确的,这道题可以练习用OpenCV实现透视变换(可以用于矫正在3维环境下的图像失真),b&c部分则是实现图像放大缩小插值,旋转图像。所有的功能都和键盘事件处理联系起来,纯OpenCV实现,和OS无关。不过,在处理SHIFT键时,我取得是其在键盘上对应字符的ASCII

qdsclove的专栏 1614

银河飞腾FT-M6678 DSP开发初体验:从仿真器连接到第一个网络程序(CCS5.5+FT-EMU560实战)

本文详细介绍了银河飞腾FT-M6678 DSP开发环境的搭建过程,包括CCS5.5开发环境的配置、FT-EMU560仿真器的连接与设置,以及关键模块如网络驱动的国产化替换。通过实战案例,帮助开发者快速掌握国产DSP的开发流程,实现网络通信功能。

weixin_30919429的博客 554

【华为OD机试真题】18、喊7的次数重排 | 机试真题+思路参考+代码解析(C++、Java、Py)

题目描述 >喊7是一个传统的聚会游戏,N个人围成一圈,按顺时针从1到N编号。   编号为1的人从1开始喊数,下一个人喊的数字为上一个人的数字加1,但是当将要喊出来的数字是7的倍数或者数字本身含有7的话,不能把这个数字直接喊出来,而是要喊”过”。   假定玩这个游戏的N个人都没有失误地在正确的时机喊了”过”,当喊到数字K时,可以统计每个人喊”过”的次数。   现给定一个长度为N的数组,存储了打乱顺序的每个人喊”过”的次数,请把它还原成正确的顺序,即数组的第i个元素存储编号i的人喊

KJ.JK 4167

《学习OpenCV》练习题第四章第二题

#include #include #pragma comment (lib,"opencv_calib3d231d.lib") #pragma comment (lib,"opencv_contrib231d.lib") #pragma comment (lib,"opencv_core231d.lib") #pragma comment (lib,"opencv_features2d23

qdsclove的专栏 1398

《QEMU/KVM源码分析与应用》读书笔记1 —— 第1章 QEMU与KVM概述

《QEMU/KVM源码分析与应用》学习笔记1 —— 第一章 QEMU与KVM概述

phmatthaus的专栏 1984

《学习OpenCV》练习题第四章第八题ab

这道题是利用OpenCV例子程序里自带的人脸检测程序,做点图像的复制操作以及alpha融合。 说明:人脸检测的程序我参照了网上现有的例子程序,没有用我用的OpenCV版本(2.4.5)的facedetect.c,人脸检测部分是一个月前写的程序,这次做这道理,做了点改动,以前的部分注释了起来。 代码: #include #include #include #inclu

qdsclove的专栏 1512

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

《学习OpenCV》练习题第二章第四题

#include #include #pragma comment (lib,"opencv_calib3d231d.lib") #pragma comment (lib,"opencv_contrib231d.lib") #pragma comment (lib,"opencv_core231d.lib") #pragma comment (lib,"opencv_features2d23

qdsclove的专栏 1151

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

《学习OpenCV》练习题第三章第四题

#include #include #include #pragma comment (lib,"opencv_calib3d231d.lib") #pragma comment (lib,"opencv_contrib231d.lib") #pragma comment (lib,"opencv_core231d.lib") #pragma comment (lib,"opencv_fe

qdsclove的专栏 1262
上一篇: 《学习OpenCV》练习题第四章第四题
下一篇: 《学习OpenCV》练习题第四章第六题
Stk_OverFlow
博客等级 码龄14年 27粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值