一、
由于项目需要,原来用GDI做的画线的功能,新的项目中考虑到垮平台的问题,打算用openCV来实现,故此做个效率对比。
二、
2点做一条线,来测试效率。
用了同样的画板大小---256*256的大小,函数通过参数输入,用GetTickCount来实现计时功能。
三、
GDI的主要循代码如下:
void show_line(int line_num,int point_num) { ULONAG start_time = get_tick_count(); VMGdiPolygon* test_polygon = new VMGdiPolygon(); int width = 256; int height = 256; test_polygon->VMIsCleanCloth(); test_polygon->VMGdiInitBuf(width,height); COLORREF color = 0x0000FF; test_polygon->VMGdiSetPenColor(color); test_polygon->VMGdiSetPenWidth(2); int rangle = width; int line_count = line_num; for (int i = 0; i < line_count;i++) { for (int j = 0; j<point_num;j++) { int x_1 = random_fun(rangle); int y_1 = random_fun(rangle); int x_2 = random_fun(rangle); int y_2 = random_fun(rangle); double pt_0[3] = {x_1,y_1,0}; double pt_2[3] = {x_2,y_2,0}; test_polygon->VMGdiLine(pt_0,pt_2); } //test_polygon->VMGdiLine(data,point_num,false); } ULONAG end_time = get_tick_count(); cout<<"start time"<<start_time<<"--->end time:"<<end_time<<endl; cout<<"the number of "<<line_count<<" lines "<<"has "<<point_num<<" 个数"<<" takes "<<end_time-start_time<<"ms "<<endl; test_polygon->VMGdiGetbitmap("D:\\001.bmp"); }
OpenCV的测试循环代码为:
void test_line(int width,int height,int line_count,int point_num,int line_width) { ULONAG start_time = get_tick_count(); int pic_width = width; int pic_height = height; Mat picture(pic_width,pic_height,CV_8UC4,Scalar(255,255,255)); int rangle = width; for (int i = 0; i < line_count;i++) { for (int j = 0; j<point_num;j++) { int x_1 = random_fun(rangle); int y_1 = random_fun(rangle); int x_2 = random_fun(rangle); int y_2 = random_fun(rangle); //画线 Point a = Point (x_1,y_1); Point center = Point(x_2,y_2); //cout<<x_1<<" "<<y_1<<endl; //参数为:承载的图像、起始点、结束点、颜色、粗细、线型 line(picture,a,center,Scalar(255,0,0),line_width,8); } } ULONAG end_time = get_tick_count(); cout<<"the number of "<<line_count<<" lines "<<" takes "<<end_time-start_time<<"ms "<<endl; imshow("底板",picture); show_info(picture); }
四、
调用过程有在main函数中设计线的条数和每条线点的格式。
时间对比:
生成的图表为:
结果对比:opencv的画线效率和GDI在1000个点的处理效率是一致的,用gettickcount使用时间的忽略不计的。
而在整体效率比较中,很明显opencv的画线效率更高。
五、
两种情况均保存成bmp格式图像。
效果对比:
放大效果:
OpenCV放大:
目前看来,opencv 处理效果较好点。
六、
两个main函数的代码
GDI main函数代码:
#include "VMGdiPolygon.h" using namespace VRMap; #include <iostream> using namespace std; #include "rw_timer.h" int random_fun(int rangle); void show_2_point_line(); void show_line(int line_num,int point_num,int line_width); //void show_polygonline(int line_num,int point_num,int line_width); void main() { //show_2_point_line(); int line_number = 1; int point_numb = 10; int line_width = 2; show_line(line_number,point_numb); //show_polygonline(line_number,point_numb,line_width); system("pause"); return; } int random_fun(int rangle) { int seed(0); int result = rand()%rangle; return result; } void show_2_point_line() { VMGdiPolygon* test_polygon = new VMGdiPolygon(); int width = 256; int height = 256; test_polygon->VMIsCleanCloth(); test_polygon->VMGdiInitBuf(width,height); double pt_0[3] = {0,0,0}; double pt_2[3] = {20,20,0}; COLORREF color = 0xFFFF00; test_polygon->VMGdiSetPenColor(color); test_polygon->VMGdiSetPenWidth(2); test_polygon->VMGdiLine(pt_0,pt_2); test_polygon->VMGdiGetbitmap("D:\\001.bmp"); } void show_line(int line_num,int point_num) { ULONAG start_time = get_tick_count(); VMGdiPolygon* test_polygon = new VMGdiPolygon(); int width = 256; int height = 256; test_polygon->VMIsCleanCloth(); test_polygon->VMGdiInitBuf(width,height); COLORREF color = 0x0000FF; test_polygon->VMGdiSetPenColor(color); test_polygon->VMGdiSetPenWidth(2); int rangle = width; int line_count = line_num; for (int i = 0; i < line_count;i++) { for (int j = 0; j<point_num;j++) { int x_1 = random_fun(rangle); int y_1 = random_fun(rangle); int x_2 = random_fun(rangle); int y_2 = random_fun(rangle); double pt_0[3] = {x_1,y_1,0}; double pt_2[3] = {x_2,y_2,0}; test_polygon->VMGdiLine(pt_0,pt_2); } //test_polygon->VMGdiLine(data,point_num,false); } ULONAG end_time = get_tick_count(); cout<<"start time"<<start_time<<"--->end time:"<<end_time<<endl; cout<<"the number of "<<line_count<<" lines "<<"has "<<point_num<<" 个数"<<" takes "<<end_time-start_time<<"ms "<<endl; test_polygon->VMGdiGetbitmap("D:\\001.bmp"); }
openCV的main函数代码:
#include <stdio.h> #include <stdlib.h> #include <time.h> using namespace std; #include "rw_timer.h" // //// #pragma comment(lib,"opencv_ml249d.lib") #pragma comment(lib,"opencv_calib3d249d.lib") #pragma comment(lib,"opencv_contrib249d.lib") #pragma comment(lib,"opencv_core249d.lib") #pragma comment(lib,"opencv_features2d249d.lib") #pragma comment(lib,"opencv_flann249d.lib") #pragma comment(lib,"opencv_gpu249d.lib") #pragma comment(lib,"opencv_highgui249d.lib") #pragma comment(lib,"opencv_imgproc249d.lib") #pragma comment(lib,"opencv_legacy249d.lib") #pragma comment(lib,"opencv_objdetect249d.lib") #pragma comment(lib,"opencv_ts249d.lib") #pragma comment(lib,"opencv_video249d.lib") #pragma comment(lib,"opencv_nonfree249d.lib") #pragma comment(lib,"opencv_ocl249d.lib") #pragma comment(lib,"opencv_photo249d.lib") #pragma comment(lib,"opencv_stitching249d.lib") #pragma comment(lib,"opencv_superres249d.lib") #pragma comment(lib,"opencv_videostab249d.lib") #pragma comment(lib,"opencv_objdetect249.lib") #pragma comment(lib,"opencv_ts249.lib") #pragma comment(lib,"opencv_video249.lib") #pragma comment(lib,"opencv_nonfree249.lib") #pragma comment(lib,"opencv_ocl249.lib") #pragma comment(lib,"opencv_photo249.lib") #pragma comment(lib,"opencv_stitching249.lib") #pragma comment(lib,"opencv_superres249.lib") #pragma comment(lib,"opencv_videostab249.lib") #pragma comment(lib,"opencv_calib3d249.lib") #pragma comment(lib,"opencv_contrib249.lib") #pragma comment(lib,"opencv_core249.lib") #pragma comment(lib,"opencv_features2d249.lib") #pragma comment(lib,"opencv_flann249.lib") #pragma comment(lib,"opencv_gpu249.lib") #pragma comment(lib,"opencv_highgui249.lib") #pragma comment(lib,"opencv_imgproc249.lib") #pragma comment(lib,"opencv_legacy249.lib") #pragma comment(lib,"opencv_ml249.lib") #include<iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> using namespace cv; int random_fun(int rangle); void show_info(Mat picture); void test_line(int width,int height,int line_count,int point_num,int line_width); void test_polyline(int width,int height,int line_count,int point_num,int line_width); int main() { int width = 256; int height = 256; int line_count = 100; int point_num = 1000; int line_width = 1; test_line(width,height,line_count,point_num,line_width); // //test_polyline(width,height,line_count,100,line_width); // 等待6000 ms后窗口自动关闭 waitKey(12000); } void show_info(Mat picture) { if (picture.data == NULL){ return; } //IplImage* test_img = cvSaveImage() int channels = picture.channels(); int rows = picture.rows; int cols = picture.cols; uchar* data = picture.data; cout<<"chanels:"<<channels<<" rows:" <<rows<<" cols:"<<cols<<endl; } void test_line(int width,int height,int line_count,int point_num,int line_width) { ULONAG start_time = get_tick_count(); int pic_width = width; int pic_height = height; Mat picture(pic_width,pic_height,CV_8UC4,Scalar(255,255,255)); int rangle = width; for (int i = 0; i < line_count;i++) { for (int j = 0; j<point_num;j++) { int x_1 = random_fun(rangle); int y_1 = random_fun(rangle); int x_2 = random_fun(rangle); int y_2 = random_fun(rangle); //画线 Point a = Point (x_1,y_1); Point center = Point(x_2,y_2); //cout<<x_1<<" "<<y_1<<endl; //参数为:承载的图像、起始点、结束点、颜色、粗细、线型 line(picture,a,center,Scalar(255,0,0),line_width,8); } } ULONAG end_time = get_tick_count(); cout<<"the number of "<<line_count<<" lines "<<" takes "<<end_time-start_time<<"ms "<<endl; imshow("底板",picture); show_info(picture); } // 读入一张图片(游戏原画) //Mat img=imread("pic.jpg"); //// 创建一个名为 "游戏原画"窗口 //cvNamedWindow("游戏原画"); //// 在窗口中显示游戏原画 //imshow("游戏原画",img); int random_fun(int rangle) { int seed(0); //srand( (unsigned)time( NULL ) ); int result = rand()%rangle; return result; } void test_polyline(int width,int height,int line_count,int point_num,int line_width) { ULONAG start_time = get_tick_count(); int pic_width = width; int pic_height = height; Mat picture(pic_width,pic_height,CV_8UC4,Scalar(255,255,255)); line_count = 1; int rangle = width; Point** test_points = new Point*[line_count]; int *npts = new int[line_count]; for (int j = 0;j < line_count;j++) { Point rook_points[1][100]; for (int k =0;k<100;k++) { int x = random_fun(rangle); int y = random_fun(rangle); rook_points[0][j] = Point( x,y); } const Point* ppt[1] = { rook_points[0] }; int npt[] = { 100 }; polylines(picture,ppt,npt,1,1,CV_RGB(0,255,0),2,8,0); } imshow("底板",picture); // //for (int j = 0;j < line_count;j++) //{ // delete []test_points[j]; // test_points[j] = NULL; //} //delete []test_points; //test_points = NULL; ULONAG end_time = get_tick_count(); cout<<"the number of "<<line_count<<" lines "<<" takes "<<end_time-start_time<<"ms "<<endl; show_info(picture); }
当然使用需要opencv的各种库的配置。opencv的下载和使用,可参考浅墨的http://blog.csdn.net/poem_qianmo/article/details/20911629
opencv教程和配置设置等博客。
源码免费下载地址:GDI测试代码
OPENCV的画线测试代码
-------------THE END--------------
若有问题,请不吝赐教。