一、

因为项目须要,原来用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. axios的坑

    1.axios默认发送application/json 格式 https://www.cnblogs.com/qdcnbj/p/8143155.html 资料: https://www.npmjs.c ...

  2. java 对象 拆箱装箱 编译和反编译的验证

    创建对象 package 创建对象的个数; public class main { public static void main(String[] agrs){ Check c1=new Check ...

  3. HTTP——学习笔记(8)

    HTTP中的一些协议内容会限制某些网站的功能使用 比如,Facebook这类的社交网站,需要实时地观察到海量用户公开发布的内容,而HTTP中的以下标准就会成为瓶颈: 一条连接上只可发送一个请求 请求只 ...

  4. Oracle学习总结(7)—— 常用的数据库索引优化语句总结

    不管是用C/C++/Java等代码编写的程序,还是SQL编写的数据库脚本,都存在一个持续优化的过程.也就是说,代码优化对于程序员来说,是一个永恒的话题. 近期,我们对之前编写的数据库脚本进行了全面的自 ...

  5. Openstack API 开发 快速入门

    Openstack 做为流行的开源云计算平台,其最大特性是利用其提供的基础设施API,让我们可以以软件的方式来动态管理IAAS资源.Openstack 提供的api是流行的Rest API.     ...

  6. maven的setting设置

    maven的setting设置,settings.xml文件,多写了几个仓库的地址: <?xml version="1.0" encoding="UTF-8&quo ...

  7. JBOSS部署项目之后,无法通过IP地址訪问,仅仅能通过localhost或者127.0.0.1訪问

    这几天入职到了一家新的公司,然后第一天就開始搭建各种环境.由于原先一直用的是Tomcat容器,然后也是第一次接触JBOSS容器,搭建完之后,在MyEclipse中启动了JBOSS容器,然后想在浏览器中 ...

  8. 转:app store 注册账号生成证书上传app完整的教程

    app store为开发者提供四种类型的申请: 个人ios开发者计划$99/年 公司ios开发者计划$99/年 企业ios开发者计划$299/年 高校ios开发者计划免费 在这里主要介绍一下公司ios ...

  9. JavaScript编程随笔

    尽管说用JS非常多年了,可是却一直停留在肤浅的阶段,对JS的机制原理依旧是一知半解,比如:闭包.尽管能说出一二.却不能说出三四,确实羞愧.近期恶补一番.并将比較与大家分享,希望对大家有些帮助. 闭包 ...

  10. javascript jquery 推断对象为空的方式

    java中存在非常多空指针的问题,须要常常做预防和推断,如若不然,控制台出现恼人的异常,让人信心备受打击,早期敲代码的时候没有经验,不能依据异常信息找到问题的根源,唯一做的事情就是祈祷,千万别出现什么 ...