一、

因为项目须要,原来用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效果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2FydHpoYW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

放大效果:

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

若有问题,请指教。

openCV 和GDI画线效率对照的更多相关文章

  1. openCV 和GDI画线效率对比

    一. 由于项目需要,原来用GDI做的画线的功能,新的项目中考虑到垮平台的问题,打算用openCV来实现,故此做个效率对比. 二. 2点做一条线,来测试效率. 用了同样的画板大小---256*256的大 ...

  2. win32画线考虑去锯齿

    整理日: 2015年2月16日 这几天一直在研究win32 SDk下画线去锯齿,之前一直用的QT的画线接口函数,里面有去锯齿的效果,可是突然项目要求不能用QT的只能用win32 SDK下的GDI画线接 ...

  3. GDI+学习之------ 画线、区域填充、写字

    <精通GDI编程>里的代码.在学习过程中对它加以总结,以防以后用到,全部代码都是在MFC 单文档中实现的,写在View::OnDraw(CDC */*pDC*/)中 画线/边框(Pen) ...

  4. Android中Path类的lineTo方法和quadTo方法画线的区别

    转载:http://blog.csdn.net/stevenhu_223/article/details/9229337 当我们需要在屏幕上形成画线时,Path类的应用是必不可少的,而Path类的li ...

  5. C#使用 DirectX SDK 9做视频播放器 并在视频画线添加文字 VMR9

    视频图像处理系列 索引 VS2013下测试通过. 在百度中搜索关键字“DirectX SDk”,或者进入微软官网https://www.microsoft.com/en-us/download/det ...

  6. WPF画线问题,几千条以后就有明显的延迟了。

      我现在是这么画的,class A { private GeometryGroup _lines; private Path _path; public A() {    _path.Data = ...

  7. 用GDI+画验证码

    1.新建一个窗体应用程序,在上面拖一个pictureBox对象,为其添加单击事件 2.创建GDI对象.产生随机数画入图片中.画线条.最后将图片到pictureBox中,代码如下: private vo ...

  8. MFC画线功能总结

    本文仅用于学习交流,商业用途请支持正版!转载请注明:http://www.cnblogs.com/mxbs/p/6216464.html MFC画线功能要点有二:其一,鼠标按下时记录初始位置为线的起始 ...

  9. MFC消息映射机制以及画线功能实现

    ---此仅供用于学习交流,切勿用于商业用途,转载请注明http://www.cnblogs.com/mxbs/p/6213404.html. 利用VS2010创建一个单文档标准MFC工程,工程名为Dr ...

随机推荐

  1. 3ds Max 2018 在安装后无法启动或出现不稳定

    问题: 安装 3ds Max 2018 后,软件无法正常启动,或在打开后不久出现不稳定和崩溃. 原因: 有多种原因可能会导致这些错误: ▪ 3ds Max.Windows 更新和 ProSound.d ...

  2. 前端路由的两种模式:hash(#)模式和history模式(转)

    随着 ajax 的使用越来越广泛,前端的页面逻辑开始变得越来越复杂,特别是spa的兴起,前端路由系统随之开始流行. 从用户的角度看,前端路由主要实现了两个功能(使用ajax更新页面状态的情况下): 记 ...

  3. C语言的常用printf打印占位符%d, %u, %f, %s, %c, %o, %x

    占位符含义及用法 代码: #include <stdio.h> int main(int argc, char const *argv[]) { , b = -; // 默认10进制赋值 ...

  4. js中获取数据类型

    ES5中,js中数据类型:number.string.boolean.undefined.null.object js中获取数据类型常用的四种方式 实例: var a = 123, b = true, ...

  5. ActiveMQ客户端配置使用

    一.通过JNDI来使用ActiveMQ 1.jndi配置JMS对象 java.naming.factory.initial = org.apache.activemq.jndi.ActiveMQIni ...

  6. 栈(stack)--c实现(使用双链表)

    是不是直接贴代码不太好,我竟然不知道说什么. 写这个考虑的问题,或者是纠结的问题是这个头指针怎么处理,也就是栈的顶部,最后采用的是初始化第一个栈空间浪费掉,栈顶是有元素的.好像应该去学习下画图,没图不 ...

  7. Docker yum 安装

      [liwm@Eren ~]$ sudo su[root@Eren liwm]# yum install -y docker 已加载插件:fastestmirror, langpacks, prod ...

  8. Json相关内容

    一. 导入包:net.sf.json.JSONObject 代码 import net.sf.json.JSON; import net.sf.json.JSONArray; import net.s ...

  9. C++primer书店程序

    #include <iostream> #include <string> #include <cassert> #include <algorithm> ...

  10. hdu4089Activation 概率dp

    //一条队列对于第一个人的情况 //概率p1:队列保持不变 //p2:第一个人到队尾 //p3:第一个人出队 //p4:系统崩溃 //队列中有N个人,Tomato 在第M位置,求系统崩溃.Tomato ...