OpenCV 自作绘图库函数

来源:互联网 发布:java开源投票系统 编辑:程序博客网 时间:2024/05/16 19:56

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



0 0