【OpenCV】功能:展示OpenCV的图像绘制功能

//功能:展示OpenCV的图像绘制功能
#include "cv.h"
#include "highgui.h"
#include <stdlib.h>
#include <stdio.h>
#define NUMBER 100
#define DELAY 5
char wndname[] = "Drawing Demo";
CvScalar random_color(CvRNG* rng) //函数 cvRNG 初始化随机数生成器并返回其状态,RNG 随机数生成器
{
	int icolor = cvRandInt(rng); //函数 cvRandInt 返回均匀分布的随机 32-bit 无符号整型值并更新 RNG 状态
	return CV_RGB(icolor&255, (icolor>>8)&255, (icolor>>16)&255); //创建 一个色彩值
}
int main( int argc, char** argv )
{
	int line_type = CV_AA; // change it to 8 to see non-antialiased graphics
	int i;
	CvPoint pt1,pt2; //基于二维整形坐标轴的点
	double angle;
	CvSize sz;   //矩形框大小,以像素为精度
	CvPoint ptt[6];
	CvPoint* pt[2];
	int arr[2];
	CvFont font;
	CvRNG rng;
	int width = 1000, height = 700;
	int width3 = width*3, height3 = height*3;
	CvSize text_size;
	int ymin = 0;
	Load the source image
		IplImage* image = cvCreateImage( cvSize(width,height), 8, 3 );
	IplImage* image2;

	cvNamedWindow(wndname, 1 );
	cvZero( image ); //#define cvZero cvSetZero   void cvSetZero( CvArr* arr ); arr 要被清空数组
	cvShowImage(wndname,image);
	rng = cvRNG((unsigned)-1);
	pt[0] = &(ptt[0]);
	pt[1] = &(ptt[3]);
	arr[0] = 3;
	arr[1] = 3;
	for (i = 0; i< NUMBER; i++)
	{
		pt1.x=cvRandInt(&rng) % width3 - width;
		pt1.y=cvRandInt(&rng) % height3 - height;
		pt2.x=cvRandInt(&rng) % width3 - width;
		pt2.y=cvRandInt(&rng) % height3 - height;
		cvLine( image, pt1, pt2, random_color(&rng), cvRandInt(&rng)%10, line_type, 0 );//绘制连接两个点的线段 
		cvShowImage(wndname,image);
		cvWaitKey(DELAY);
	}
	for (i = 0; i< NUMBER; i++)
	{
		pt1.x=cvRandInt(&rng) % width3 - width;
		pt1.y=cvRandInt(&rng) % height3 - height;
		pt2.x=cvRandInt(&rng) % width3 - width;
		pt2.y=cvRandInt(&rng) % height3 - height;
		cvRectangle( image,pt1, pt2, random_color(&rng), cvRandInt(&rng)%10-1, line_type, 0 );//绘制简单、指定粗细或者带填充的 矩形
		cvShowImage(wndname,image);
		cvWaitKey(DELAY);
	}
	for (i = 0; i< NUMBER; i++)
	{
		pt1.x=cvRandInt(&rng) % width3 - width;
		pt1.y=cvRandInt(&rng) % height3 - height;
		sz.width =cvRandInt(&rng)%200;
		sz.height=cvRandInt(&rng)%200;
		angle = (cvRandInt(&rng)%1000)*0.180;
		cvEllipse( image, pt1, sz, angle, angle - 100, angle + 200,random_color(&rng), cvRandInt(&rng)%10-1, line_type, 0 );//函数cvEllipse用来绘制或者填充一个简单的椭圆弧或椭圆扇形
		cvShowImage(wndname,image);
		cvWaitKey(DELAY);
	}
	for (i = 0; i< NUMBER; i++)
	{
		pt[0][0].x=cvRandInt(&rng) % width3 - width;
		pt[0][0].y=cvRandInt(&rng) % height3 - height;
		pt[0][1].x=cvRandInt(&rng) % width3 - width;
		pt[0][1].y=cvRandInt(&rng) % height3 - height;
		pt[0][2].x=cvRandInt(&rng) % width3 - width;
		pt[0][2].y=cvRandInt(&rng) % height3 - height;
		pt[1][0].x=cvRandInt(&rng) % width3 - width;
		pt[1][0].y=cvRandInt(&rng) % height3 - height;
		pt[1][1].x=cvRandInt(&rng) % width3 - width;
		pt[1][1].y=cvRandInt(&rng) % height3 - height;
		pt[1][2].x=cvRandInt(&rng) % width3 - width;
		pt[1][2].y=cvRandInt(&rng) % height3 - height;
		cvPolyLine( image, pt, arr, 2, 1, random_color(&rng), cvRandInt(&rng)%10, line_type, 0 );//函数cvPolyLine 绘制一个简单的或多样的多角曲线
		cvShowImage(wndname,image);
		cvWaitKey(DELAY);
	}
	for (i = 0; i< NUMBER; i++)
	{
		pt[0][0].x=cvRandInt(&rng) % width3 - width;
		pt[0][0].y=cvRandInt(&rng) % height3 - height;
		pt[0][1].x=cvRandInt(&rng) % width3 - width;
		pt[0][1].y=cvRandInt(&rng) % height3 - height;
		pt[0][2].x=cvRandInt(&rng) % width3 - width;
		pt[0][2].y=cvRandInt(&rng) % height3 - height;
		pt[1][0].x=cvRandInt(&rng) % width3 - width;
		pt[1][0].y=cvRandInt(&rng) % height3 - height;
		pt[1][1].x=cvRandInt(&rng) % width3 - width;
		pt[1][1].y=cvRandInt(&rng) % height3 - height;
		pt[1][2].x=cvRandInt(&rng) % width3 - width;
		pt[1][2].y=cvRandInt(&rng) % height3 - height;
		cvFillPoly( image, pt, arr, 2, random_color(&rng), line_type, 0 );//函数cvFillPoly用于一个单独被多变形轮廓所限定的区域内进行填充
		cvShowImage(wndname,image);
		cvWaitKey(DELAY);
	}
	for (i = 0; i< NUMBER; i++)
	{
		pt1.x=cvRandInt(&rng) % width3 - width;
		pt1.y=cvRandInt(&rng) % height3 - height;
		cvCircle( image, pt1, cvRandInt(&rng)%300, random_color(&rng),
			cvRandInt(&rng)%10-1, line_type, 0 );//函数cvCircle绘制或填充一个给定圆心和半径的圆
		cvShowImage(wndname,image);
		cvWaitKey(DELAY);
	}
	for (i = 1; i< NUMBER; i++)
	{
		pt1.x=cvRandInt(&rng) % width3 - width;
		pt1.y=cvRandInt(&rng) % height3 - height;
		cvInitFont( &font, cvRandInt(&rng) % 8,
			(cvRandInt(&rng)%100)*0.05+0.1,
			(cvRandInt(&rng)%100)*0.05+0.1, 
			(cvRandInt(&rng)%5)*0.1, cvRound(cvRandInt(&rng)%10),line_type );//字体结构初始化。函数 cvRound, cvFloor, cvCeil 用一种舍入方法将输入浮点数转换成整数。 cvRound 返回和参数最接近的整数值
		cvPutText( image, "Northeast Petroleum University!", pt1, &font, random_color(&rng));//在图像中加入文本
		cvShowImage(wndname,image);
		cvWaitKey(DELAY);
	}
	cvInitFont( &font, CV_FONT_HERSHEY_COMPLEX, 3, 3, 0.0, 5, line_type );
	cvGetTextSize( "Opencv forever!", &font, &text_size, &ymin );//设置字符串文本的宽度和高度
	pt1.x = (width - text_size.width)/2;
	pt1.y = (height + text_size.height)/2;
	image2 = cvCloneImage(image);
	for( i = 0; i < 255; i++ )
	{
		cvSubS( image2, cvScalarAll(i), image, 0 );//函数 cvSubS 从原数组的每个元素中减去一个数量
		cvPutText( image, "shentuhongfeng    forever!", pt1, &font, CV_RGB(255,i,i));
		cvShowImage(wndname,image);
		cvWaitKey(DELAY);
	}
	//Wait for a key stroke; the same function arranges events processing
	cvWaitKey(0);
	cvReleaseImage(&image);
	cvReleaseImage(&image2);
	cvDestroyWindow(wndname);
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值