Opencv第一个简单程序

参照《学习Opencv》 第四章:

运行时,按A随机增加20个小圆圈,鼠标点击一次图像则增加一个圆圈,三个滑动条调节圆圈颜色,按ESC退出图像。

 

// opencv_second.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "stdlib.h"
#include "cv.h"
#include "highgui.h"

int count;									   
CvScalar color;									
IplImage* img;
int posR, posG, posB;


void on_track(int pos);							//滑动条处理函数
void on_mouse(int event, int x, int y, int flags, void* param);			//鼠标处理函数

int _tmain(int argc, _TCHAR* argv[])
{
	printf("hot keys: \n"
		"\tESC - quit the program \n"
		"\ta - add 20 points\n");
	count = 20;									//初始化显示的圆圈数
	color = CV_RGB(100, 100, 100);				//初始化圆圈的颜色
	posR = posG = posB = 100;					//初始化三个滑动条的值
	img = cvCreateImage(cvSize(400, 400), 8, 3);		//创建图像(尺寸,像素深度,像素通道)
	cvNamedWindow("samples");							//创建名为“samples”的窗口,该窗口大小随图像的大小而改变

	cvSetMouseCallback("samples", on_mouse, 0);			//注册鼠标处理程序,调用on_mouse函数
	cvCreateTrackbar("B", "samples", &posB, 255, on_track);	//创建名为B的滑动条,最大值为255,回调函数on_track
	cvCreateTrackbar("G", "samples", &posG, 255, on_track);
	cvCreateTrackbar("R", "samples", &posR, 255, on_track);

	on_track(posR);								//将初始值表现在图像上(如果没有这一句,显示的只是一个窗口)					

	for (;;)									//进入循环
	{
		int key = cvWaitKey(0);					//中止程序的等待按键
		bool exit = false;						//退出标志位
		switch (char(key))		
		{
		case '\x1b':							//若按下ESC,则置标志位为1
			printf("Exiting...\n");
			exit = true;	
		case 'a':								//若按下a,则增加20个圆圈
			count += 20;
			on_track(posR);						//刷新图像,实际该函数并没有用到参数posR
		}
		if (exit)								//若标志位为1,则退出循环
			break;
	}

	cvReleaseImage(&img);						//释放图像资源
	cvDestroyWindow("samples");					//销毁窗口
		
	system("pause");
	return 0;
}

void on_track(int pos)
{
	cvZero(img);								//初始化图像,值为0
	CvPoint center;								//坐标结构体
	color.val[0] = posR;						//获取滑动条上的值
	color.val[1] = posG;
	color.val[2] = posB;

	CvRNG rng = cvRNG(0xffffffff);				//	随机数种子
	for (int i = 0; i < count; i++)				//随机生成count个圆圈
	{	
		center.x = cvRandInt(&rng)%img->width;	//随机生成的值不会超过宽和高
		center.y = cvRandInt(&rng)%img->height;
		cvCircle(img, center, 2, color);		//该函数产生圆圈
	}
	cvShowImage("samples",img);					//显示图片
}

void on_mouse(int event, int x, int y, int flags, void* param)
{		
	if (event == CV_EVENT_LBUTTONUP)			//如果鼠标左键按下后松开
	{
		count++;			
		CvPoint center;						
		center.x = x;							//记录下鼠标点击的坐标
		center.y = y;

		cvCircle(img, center, 2, color);		//再点击处显示圆圈
		cvShowImage("samples",img);
	}
}






 

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值