#include "cv.h"
#include "highgui.h"
#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
void EdgeOpenMP(IplImage *src,IplImage *dst,int thresh)
{
int height = src->height;
int width = src->width;
int step = src->widthStep;
uchar *data1 = (uchar *)src->imageData;
uchar *data2 = (uchar *)dst->imageData;
int i=step;
#pragma omp parallel for
for(i=step+1;i<height*width;i++){
if(abs(data1[i]-data1[i-1])>thresh || abs(data1[i]-data1[i-step])>thresh)
data2[i]=255;/* 对于单通道,前后两帧差分大于门限
或者对于多通道前后两帧的一个指标差分大于门限,则视为边缘*/
else
data2[i]=0;
}
}
void Edge(IplImage *src,IplImage *dst,int thresh)
{
int height = src->height;
int width = src->width;
int step = src->widthStep;
uchar *data1 = (uchar *)src->imageData;
uchar *data2 = (uchar *)dst->imageData;
int i=step;
for(i=step+1;i<height*width;i++){
if(abs(data1[i]-data1[i-1])>thresh || abs(data1[i]-data1[i-step])>thresh)
data2[i]=255;
else
data2[i]=0;
}
}
int main()
{
char filename[512];
IplImage *src,*edge1,*edge2;
puts("File name:");
gets(filename);
src = cvLoadImage(filename,CV_LOAD_IMAGE_GRAYSCALE );
edge1=cvCloneImage(src);
edge2=cvCloneImage(src);
cvNamedWindow("src", CV_WINDOW_AUTOSIZE);
cvMoveWindow("src", 100, 100);
cvShowImage( "src", src);
cvNamedWindow("Edge", CV_WINDOW_AUTOSIZE);
cvMoveWindow("Edge", 200, 100);
cvNamedWindow("EdgeOpenMP", CV_WINDOW_AUTOSIZE);
cvMoveWindow("EdgeOpenMP", 300, 100);
/* 以上都是准备一些窗口和图形基本数据 */
int tekrar=100;//运行次数
int thresh=30;
double start, end,t1, t2;
/* 计算没有使用OpenMP优化的时间 */
start= (double)cvGetTickCount();//记下开始的时钟计数,以便计算函数或用户代码执行时间
for(int i=0;i<tekrar;i++)
Edge(src,edge1,thresh);
end= (double)cvGetTickCount();//记下结束的时钟计数
t1= (end-start)/((double)cvGetTickFrequency()*1000.);//计算运行时间,以毫秒为单位
printf( "Run time without OpenMP = %g ms\n", t1 );
/* 计算使用了OpenMP优化的时间 */
start= (double)cvGetTickCount();
for(int i=0;i<tekrar;i++)
EdgeOpenMP(src,edge2,thresh);
end= (double)cvGetTickCount();
t2= (end-start)/((double)cvGetTickFrequency()*1000.);
printf( "Run time with OpenMP = %g ms\n", t2 );
printf( "Performance ratio (%%) = %% %.1f \n", 100*(t1/t2-1) );
cvShowImage( "Edge", edge1);
cvShowImage( "EdgeOpenMP", edge2);
cvWaitKey();
cvDestroyWindow("Edge");
cvDestroyWindow("EdgeOpenMP");
cvReleaseImage(&src);
cvReleaseImage(&edge1);
cvReleaseImage(&edge2);
}
这是我的结果:
File name:
dog.jpg
Run time without OpenMP = 647.627 ms
Run time with OpenMP = 453.001 ms
Performance ratio (%) = % 43.0
分享到:
相关推荐
OpenCV教程——基础篇 作者:刘瑞祯 于仕琪 机器视觉方面的书,很不错。
《OpenCV教程——基础篇》刘瑞祯 实例源代码。有注释,project,范例代码齐全。
opencv教程——基础篇书籍第五章的部分实例代码
OpenCV教程——基础篇3,于仕琪著,这两天正在学习
OpenCV教程——基础篇,于仕琪著,这两天正在学习
OpenCV教程——基础篇1/3,于仕琪著,这两天正在学习。
opencv教程——基础篇书籍的第四章第五章部分的示例代码
OpenCV教程——基础篇.part1 作 者:于仕琪 刘瑞祯 编著
OpenCV教程——基础篇(刘瑞祯 于仕琪)---源代码
opencv教程——基础篇书籍中的第二章的示例代码
目前,OpenCV逐步成为一个通用的基础研究...OpenCV实现了大量通用算法,涉及到图像处理、结构分析、运动检测、摄像机定标、三维重建以及机器学习等方面,并有较高的运行效率。书中所有实例均提供了C/C++语言的源代码。
目前,OpenCV逐步成为一个通用的基础研究...OpenCV实现了大量通用算法,涉及到图像处理、结构分析、运动检测、摄像机定标、三维重建以及机器学习等方面,并有较高的运行效率。书中所有实例均提供了C/C++语言的源代码。
一本介绍OpenCV的基础图书,对OpenCV开放源代码计算机视觉库进行的详细讲解
《OpenCV基础教程》一书的光盘 ...OpenCV实现了大量通用算法,涉及到图像处理、结构分析、运动检测、摄像机定标、三维重建以及机器学习等方面,并有较高的运行效率。书中所有实例均提供了C/C++语言的源代码。
含实例、图片及程序代码,还有于仕琪的幻灯片讲义
这是于老师出的关于opencv 的第一版书,讲的很细,值得初学者学习。
OpenCV教程基础篇 电子书 pdf 作者:刘瑞祯 于仕琪 本书是国内第一本全面介绍OpenCV的中文版图书,对OpenCV开放源代码计算机视觉库进行了详细讲解。
《OpenCV教程——基础篇》实例源代码
书中的C/C++语言实例。各实例子目录中的*.dsw和*.dsp文件分别为Windows下Visual C++ 6.0的Workspace文件和Project文件;Makefile是Linux下GNU Make的输入文件。在Windows环境下,双击*.dsw文件将会启动Visual C++ ...
penCV教程——基础篇.part2 作 者:于仕琪 刘瑞祯 编著