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效果:
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測试代码
-------------THE END--------------
若有问题,请指教。
openCV 和GDI画线效率对照的更多相关文章
- openCV 和GDI画线效率对比
一. 由于项目需要,原来用GDI做的画线的功能,新的项目中考虑到垮平台的问题,打算用openCV来实现,故此做个效率对比. 二. 2点做一条线,来测试效率. 用了同样的画板大小---256*256的大 ...
- win32画线考虑去锯齿
整理日: 2015年2月16日 这几天一直在研究win32 SDk下画线去锯齿,之前一直用的QT的画线接口函数,里面有去锯齿的效果,可是突然项目要求不能用QT的只能用win32 SDK下的GDI画线接 ...
- GDI+学习之------ 画线、区域填充、写字
<精通GDI编程>里的代码.在学习过程中对它加以总结,以防以后用到,全部代码都是在MFC 单文档中实现的,写在View::OnDraw(CDC */*pDC*/)中 画线/边框(Pen) ...
- Android中Path类的lineTo方法和quadTo方法画线的区别
转载:http://blog.csdn.net/stevenhu_223/article/details/9229337 当我们需要在屏幕上形成画线时,Path类的应用是必不可少的,而Path类的li ...
- C#使用 DirectX SDK 9做视频播放器 并在视频画线添加文字 VMR9
视频图像处理系列 索引 VS2013下测试通过. 在百度中搜索关键字“DirectX SDk”,或者进入微软官网https://www.microsoft.com/en-us/download/det ...
- WPF画线问题,几千条以后就有明显的延迟了。
我现在是这么画的,class A { private GeometryGroup _lines; private Path _path; public A() { _path.Data = ...
- 用GDI+画验证码
1.新建一个窗体应用程序,在上面拖一个pictureBox对象,为其添加单击事件 2.创建GDI对象.产生随机数画入图片中.画线条.最后将图片到pictureBox中,代码如下: private vo ...
- MFC画线功能总结
本文仅用于学习交流,商业用途请支持正版!转载请注明:http://www.cnblogs.com/mxbs/p/6216464.html MFC画线功能要点有二:其一,鼠标按下时记录初始位置为线的起始 ...
- MFC消息映射机制以及画线功能实现
---此仅供用于学习交流,切勿用于商业用途,转载请注明http://www.cnblogs.com/mxbs/p/6213404.html. 利用VS2010创建一个单文档标准MFC工程,工程名为Dr ...
随机推荐
- eclipse的springMVC环境搭建并输出HelloWorld
spring简单介绍:https://www.cnblogs.com/package-java/p/10368672.html 1.创建一个Maven Project项目 点击下一步 点击下一步 2. ...
- 关于Scrapy爬虫项目运行和调试的小技巧(下篇)
前几天给大家分享了关于Scrapy爬虫项目运行和调试的小技巧上篇,没来得及上车的小伙伴可以戳超链接看一下.今天小编继续沿着上篇的思路往下延伸,给大家分享更为实用的Scrapy项目调试技巧. 三.设置网 ...
- 解决Windows下git需要每次都要ssh-add的问题
顽皮的很: 不知道怎么回事,每次打开git提交代码都需要ssh-add一下秘钥才可以正常提交: 不然就报错权限之类的问题: 怎么才能更方便一些? 卸了重装!我没试... 再或者是在 git 的安装目录 ...
- vue mint-ui swipe 不显示或显示空白
vue mint-ui swipe 不显示或显示空白? 解决需要在mt-swipe上层元素设置高度 <div> <div> <mt-header title=" ...
- springboot ajax返回html
因为拦截器 或者是 shiro 拦截登陆接口
- 抓取豆瓣的电影排行榜TOP100
#!/usr/bin/env python # -*- coding:utf-8 -*- """ 一个简单的Python爬虫, 用于抓取豆瓣电影Top前100的电影的名称 ...
- Mysql学习总结(20)——MySQL数据库优化的最佳实践
1)谨慎而有效地使用索引 选择合理的索引(前缀性及可选性).删除没有用的索引. 2)使用规范化,但不要使用过头 规范化(至少是第三范式)是一个易于理解且标准的方法.然而,在有些情况下,你可能希望违反这 ...
- ZOJ 1825 Compound Words
Compound Words Time Limit: 5000ms Memory Limit: 32768KB This problem will be judged on ZJU. Original ...
- 在AutoLyout中动态获得cell的高度 和 autoLyout中的小随笔
autoLyout中动态获得cell的高度和autoLyout小总结 一.在autoLyout中通过动态的方式来获取cell 的方式呢? 1. 在布局时候要有对于cell中contentV ...
- 实现浮点数的四舍五入RoundOff,保留几位小数
直接上代码,非常简短 double myRound(double d,int n) { d = d*pow(10,n); d += 0.5; d = (long)d; d = d/pow(10,n); ...