• openCV 和GDI画线效率对比


    一、

    由于项目需要,原来用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格式图像。

    效果对比:

    GDI效果:

    OpenCV效果:


    放大效果:

    GDI效果:

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

    若有问题,请不吝赐教。



  • 相关阅读:
    通过Http接口及SolrNet 两种方法基于Solr5.5.1 实现CURD
    Solr5.5.1 IK中文分词配置与使用
    windows环境tomcat8配置Solr5.5.1
    初谈SQL Server逻辑读、物理读、预读
    C#6新特性,让你的代码更干净
    PJAX初体验(主要是利用HTML5 新增API pushState和replaceState+AJAX)
    js实现String.Fomat
    iOS 画虚线
    UIFont字体大全
    iOS 里RGB 配色 UIColor colorWithRed
  • 原文地址:https://www.cnblogs.com/qitian1/p/6461976.html
Copyright © 2020-2023  润新知