一、
因为项目须要,原来用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; jVMGdiLine(pt_0,pt_2);
}
//test_polygon->VMGdiLine(data,point_num,false);
}
ULONAG end_time = get_tick_count();
cout<<"start time"<end time:"<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
四、
调用过程有在main函数中设计线的条数和每条线点的格式。
时间对照:
生成的图表为:
结果对照:opencv的画线效率和GDI在1000个点的处理效率是一致的,用gettickcount使用时间的忽略不计的。
而在总体效率比較中,非常明显opencv的画线效率更高。
五、
两种情况均保存成bmp格式图像。
效果对照:
放大效果:
OpenCV放大:
眼下看来。opencv 处理效果较好点。
六、
两个main函数的代码
GDI main函数代码:
#include "VMGdiPolygon.h"
using namespace VRMap;
#include
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; jVMGdiLine(pt_0,pt_2);
}
//test_polygon->VMGdiLine(data,point_num,false);
}
ULONAG end_time = get_tick_count();
cout<<"start time"<end time:"<VMGdiGetbitmap("D:\\001.bmp");
}
openCV的main函数代码:
#include
#include
#include
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
#include
#include
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:"<
当然使用须要opencv的各种库的配置。opencv的下载和使用。可參考浅墨的http://blog.csdn.net/poem_qianmo/article/details/20911629
opencv教程和配置设置等博客。
源代码免费下载地址:GDI測试代码
OPENCV的画线測试代码
-------------THE END--------------
若有问题,请指教。