一、

由于项目需要,原来用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--------------

若有问题,请不吝赐教。

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

  1. openCV 和GDI画线效率对照

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

  2. win32画线考虑去锯齿

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

  3. 【Python | opencv+PIL】常见操作(创建、添加帧、绘图、读取等)的效率对比及其优化

    一.背景 本人准备用python做图像和视频编辑的操作,却发现opencv和PIL的效率并不是很理想,并且同样的需求有多种不同的写法并有着不同的效率.见全网并无较完整的效率对比文档,遂决定自己丰衣足食 ...

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

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

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

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

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

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

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

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

  8. 用GDI+画验证码

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

  9. MFC画线功能总结

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

随机推荐

  1. 分享一个js加密的几种方法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. Codefroces Educational Round 27 845G Shortest Path Problem?

    Shortest Path Problem? You are given an undirected graph with weighted edges. The length of some pat ...

  3. 搭建Spark源码研读和代码调试的开发环境

    转载自https://github.com/linbojin/spark-notes/blob/master/ide-setup.md 搭建Spark源码研读和代码调试的开发环境 工欲善其事,必先利其 ...

  4. last---显示用户最近登录信息

    last命令用于显示用户最近登录信息.单独执行last命令,它会读取/var/log/wtmp的文件,并把该给文件的内容记录的登入系统的用户名单全部显示出来. 语法 last(选项)(参数) 选项 - ...

  5. Python3.7&Django1.11.15 兼容性问题

    环境: 1. Windows10 2. python3.7 3. Django1.11.15 启动Django时抛出以下异常: Unhandled exception in thread starte ...

  6. postgresql 查看单个表大小

    3中方法,不论什么一个都行 方法一 ,查一个表 select pg_size_pretty(pg_relation_size('table_name')); 方法二 ,查出全部表并按大小排序 SELE ...

  7. ThreadLocal使用演示样例

    MainActivity例如以下: package cc.cv; import android.os.Bundle; import android.app.Activity; /** * Demo描写 ...

  8. HDU 5188 zhx and contest(带限制条件的 01背包)

    Problem Description As one of the most powerful brushes in the world, zhx usually takes part in all ...

  9. 76.CGI编码

    CGI编码 "%D6%DC%C8%F0%B8%A3"; 转换到字符串中: //CGI编码转到char类型的tmpstr中中 char* change(char *str) { // ...

  10. Navicat for MySQL 新建查询时,报can't create file ...系统找不到指定的文件夹出现问题

    如图点击新建查询报错 解决办法 将这个路径修改一下就ok了