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图像