参照《学习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);
}
}