OpenCV 自作绘图库函数

本文介绍了一组基于OpenCV的自定义库函数,用于简化图像处理任务中的绘图操作。这些函数包括初始化绘图区域、设置背景颜色、绘制点、线、矩形等基本图形元素,并展示了如何在实际代码中应用这些函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

OpenCV自作库函数,方便图像处理时,方便调用:

主要函数如下:

int  initgraph(int width, int height):初始化一个区域用来绘图

void setbkcolor(unsigned int color):设置绘图区域背景颜色

void Point(int x, int y, unsigned int color):在绘图区域画一个点而不立即显示

void draw_point(int x, int y, unsigned int color):在绘图区域画一个点立即显示

void  draw_hline(int x0, int y0, int x1, unsigned int color) :画一条横线

void  draw_vline(int x0, int y0, int y1, unsigned int color) :画一条纵线

void  draw_rect(int x0, int y0, int x1, int y1,  unsigned int color):画一个矩形框

void draw_line(int x1,int y1,int x2,int y2, unsigned int color):画一条任意两坐标之间的线段

void draw_rgb(char *temp, int width, int height, int x, int y):显示某一内存3通道的RGB数据图像

void draw_gray(char *temp, int width, int height, int x, int y):显示某一内存灰度图像


测试源码如下:

#include <stdio.h>
#include "highgui.h"
#include <time.h>
//using namespace cv;
#define WIN_NAME "CarId"


#define RGB(a,b,c)			(a << 16 | b << 8 | c)

IplImage* pImg; 
CvSize size;
char *pbmp;

int initgraph(int width, int height);
void setbkcolor(unsigned int color);
void draw_hline(int x0, int y0, int x1, unsigned int color) ;
void draw_vline(int x0, int y0, int x1, unsigned int color) ;
void draw_rgb(char *temp, int width, int height, int x, int y);
void draw_gray(char *temp, int width, int height, int x, int y);
void draw_rect(int x0, int y0, int x1, int y1,  unsigned int color);
void draw_line(int x1,int y1,int x2,int y2, unsigned int color);

void main()
{
	IplImage* pbmp;
	initgraph(800, 700);
	setbkcolor(RGB(255, 255, 255));
	draw_hline(0, 100, 200, 0x00ff00ff);
	draw_vline(100, 200, 0, 0x000000);
	draw_line(0, 0, 200, 400, 0x000000);
	draw_rect(0, 0, 200, 400, 0x00ffff00);
	 if((pbmp = cvLoadImage("baboon.jpg", 1)) != 0 )
	 {
		    cvNamedWindow( "Image", 1 );//创建窗口
			cvShowImage( "Image", pbmp );//显示图像
				cvWaitKey(1);
	 }
	 draw_rgb(pbmp->imageData, pbmp->widthStep/3, pbmp->height, 0, 0);

	cvWaitKey(0);
}

int  initgraph(int width, int height)
{
	size.height = height;
	size.width = width;
	pImg = cvCreateImage(size, 8, 3);
	
	pImg->imageData = (char *)malloc(size.height * pImg->width * 3);
	if(pImg->imageData == NULL)
	{
		printf("initgraph alloc mem fail\n");
		exit(-1);
	}
	pbmp = pImg->imageData;
	cvNamedWindow(WIN_NAME, 1 );
	cvShowImage(WIN_NAME, pImg );
	cvWaitKey(1);
	return 0;
}

void setbkcolor(unsigned int color)
{
	int i, j;
	unsigned char r,g,b;
	for(i = 0; i < size.height; i++)
	{
		for(j = 0; j < size.width; j++)
		{
			r = (color >> 16) & 0xff;
			g = (color >> 8) & 0xff;
			b = color & 0xff;
			
			pImg->imageData[i * pImg->width * 3 + j * 3] = b;
			pImg->imageData[i * pImg->width * 3 + j * 3 + 1] = g;
			pImg->imageData[i * pImg->width * 3 + j * 3 + 2] = r;
		}
	}
	cvShowImage( WIN_NAME, pImg );
		cvWaitKey(1);
}
void Point(int x, int y, unsigned int color)
{
	unsigned char r, g, b;
	if ( ( x < size.width) && ( y < size.height) )
	{
			r = (color >> 16) & 0xff;
			g = (color >> 8) & 0xff;
			b = color & 0xff;
			pImg->imageData[y * pImg->width * 3 + x * 3] = b;
			pImg->imageData[y * pImg->width * 3 + x * 3 + 1] = g;
			pImg->imageData[y * pImg->width * 3 + x * 3 + 2] = r;
	}
	//cvWaitKey(1);
}
void draw_point(int x, int y, unsigned int color)
{
	unsigned char r, g, b;
	if ( ( x < size.width) && ( y < size.height) )
	{
			r = (color >> 16) & 0xff;
			g = (color >> 8) & 0xff;
			b = color & 0xff;
			pImg->imageData[y * pImg->width * 3 + x * 3] = b;
			pImg->imageData[y * pImg->width * 3 + x * 3 + 1] = g;
			pImg->imageData[y * pImg->width * 3 + x * 3 + 2] = r;
	}
	cvShowImage( WIN_NAME, pImg );
	cvWaitKey(1);
}
void  draw_hline(int x0, int y0, int x1, unsigned int color) 
{  
	int i, k;
	if (x0 > x1)
	{
		k = x0;
		x0 = x1;
		x1 = k;
	}
	for(i = x0; i < x1; i++)
		Point(i, y0, color);
	cvShowImage( WIN_NAME, pImg );
	cvWaitKey(1);
}
void  draw_vline(int x0, int y0, int y1, unsigned int color) 
{  
	int i, k;
	if (y0 > y1)
	{
		k = y0;
		y0 = y1;
		y1 = k;
	}
	for(i = y0; i < y1; i++)
		Point(x0, i, color);
	cvShowImage( WIN_NAME, pImg );
	cvWaitKey(1);
}
void  draw_rect(int x0, int y0, int x1, int y1,  unsigned int color)
{  draw_hline(x0, y0, x1, color);
   draw_hline(x0, y1, x1, color);
   draw_vline(x0, y0, y1, color);
   draw_vline(x1, y0, y1, color);
}
void draw_line(int x1,int y1,int x2,int y2, unsigned int color)
{
	int dx, dy, e;

	dx = x2-x1; 
	dy = y2-y1;
    
	if(dx >= 0)
	{
		if(dy >= 0) // dy>=0
		{
			if(dx >= dy) // 1/8 octant
			{
				e = dy - dx/2;
				while(x1 <= x2)
				{
					Point(x1, y1, color);
					if(e > 0)
					{
						y1 += 1;
						e -= dx;
					}	
					x1 += 1;
					e += dy;
				}
			}
			else		// 2/8 octant
			{
				e = dx - dy/2;
				while(y1 <= y2)
				{
					Point(x1,y1,color);
					if(e > 0)
					{ 
						x1 += 1;
						e-= dy;
					}	
					y1 += 1;
					e += dx;
				}
			}
		}
		else		   // dy<0
		{
			dy =- dy;   // dy=abs(dy)

			if(dx >= dy) // 8/8 octant
			{
				e = dy - dx/2;
				while(x1 <= x2)
				{
					Point(x1, y1, color);
					if(e > 0)
					{
						y1 -= 1;
						e -= dx;
					}	
					x1 += 1;
					e += dy;
				}
			}
			else		// 7/8 octant
			{
				e = dx - dy/2;
				while(y1 >= y2)
				{
					Point(x1, y1, color);
					if(e > 0)
					{
						x1 += 1;
						e -= dy;
					}	
					y1 -= 1;
					e += dx;
				}
			}
		}	
	}
	else //dx<0
	{
		dx =- dx;		//dx=abs(dx)
		if(dy >= 0) // dy>=0
		{
			if(dx >= dy) // 4/8 octant
			{
				e = dy - dx/2;
				while(x1 >= x2)
				{
					Point(x1, y1, color);
					if(e > 0)
					{
						y1 += 1;
						e -= dx;
					}	
					x1 -= 1;
					e += dy;
				}
			}
			else		// 3/8 octant
			{
				e = dx - dy/2;
				while(y1 <= y2)
				{
					Point(x1, y1, color);
					if(e > 0)
					{
						x1 -= 1;
						e -= dy;
					}	
					y1 += 1;
					e += dx;
				}
			}
		}
		else		   // dy<0
		{
			dy =- dy;   // dy=abs(dy)

			if(dx >= dy) // 5/8 octant
			{
				e = dy - dx/2;
				while(x1 >= x2)
				{
					Point(x1, y1, color);
					if(e>0)
					{
						y1 -= 1;
						e -= dx;
					}	
					x1 -= 1;
					e += dy;
				}
			}
			else		// 6/8 octant
			{
				e = dx - dy/2;
				while(y1 >= y2)
				{
					Point(x1, y1, color);
					if(e > 0)
					{
						x1 -= 1;
						e -= dy;
					}	
					y1 -= 1;
					e += dx;
				}
			}
		}	
	}
		cvShowImage( WIN_NAME, pImg );
		cvWaitKey(1);
}

void draw_rgb(char *temp, int width, int height, int x, int y)
{
	int i,j;

   	for(i = 0; i < height; i++)
    {
        for(j = 0; j < width; j++)
       {  
		   if((y + i < size.height) && (x + j < size.width))
		   {
				pbmp[(y + i) * pImg->width * 3 + (x + j) * 3] = temp [i * width * 3 + j * 3];
				pbmp[(y + i) * pImg->width * 3 + (x + j) * 3 + 1] = temp [i * width * 3 + j * 3 + 1];
				pbmp[(y + i) * pImg->width * 3 + (x + j) * 3 + 2] = temp [i * width * 3 + j * 3 + 2];
		   }
		}
    }
	cvShowImage( WIN_NAME, pImg );
	cvWaitKey(1);
}
void draw_gray(char *temp, int width, int height, int x, int y)
{
	int i,j;

   	for(i = 0; i < height; i++)
    {
        for(j = 0; j < width; j++)
       {  
		   if((y + i < size.height) && (x + j < size.width))
		   {
				pbmp[(y + i) * pImg->width * 3 + (x + j) * 3] = temp[i * width + j];
				pbmp[(y + i) * pImg->width * 3 + (x + j) * 3 + 1] = temp[i * width + j];
				pbmp[(y + i) * pImg->width * 3 + (x + j) * 3 + 2] = temp[i * width + j];
		   }
		}
    }
	cvShowImage( WIN_NAME, pImg );
	cvWaitKey(1);
}

效果图如下:

1、横线、纵线、矩形框、斜线


RGB图像



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值