OpenCV2.4.3的新特征

摘自:http://www.cnblogs.com/tornadomeet/archive/2012/11/07/2759476.html

OpenCV2.4.3的新特征:

  在经过4个月的等待后,OpenCV又发布了新版本了,此时的最新版本为OpenCV2.4.3,下载地址为:OpenCV-2.4.3.exe

  下面来看看opencv2.4.3有了哪些新变化,主要是参考网页http://code.opencv.org/projects/opencv/wiki/ChangeLog上面介绍的,稍加翻译了一些,因为对有些专有名词不熟,所以可能翻译得不妥。这次版本的变化内容有不少是来源于google summer code(GSoC),那个项目贡献了不少code。

 

   

  多线程方面,后台增加许多通用的多线程并行处理算法,比如说基于交叉平台的TBB和OpenMP,基于苹果平台的Grand Central Dispatch,微软的Concurrency computing等。因为OpenCV内嵌了这些后台算法,所以用户甚至都不需要装这些后台库。

 

  

  在android方面,提高了OpenCV的管理,增加了新的Java框架 例程,android上能够更好地支持摄像头,具体的细节改变参考:Android Release Notes

  

  

  在ios系统方面,opencv2.framework完全支持ios6和iphone5了。ios上安装opencv的教程可以参考:

  http://docs.opencv.org/doc/tutorials/ios/table_of_content_ios/table_of_content_ios.html.

   

  

  在Python方面,增加了一些实例,包括ASIFT,手写字识别,运动去噪和Amazon PiCloud的使用。其使用参考:

  https://github.com/Itseez/opencv/tree/master/samples/python2

 

  

  在人脸检测方面,由于GSoC的贡献,增加了2个侧脸的级联分类器文件,可以参考网页:https://github.com/Itseez/opencv/tree/master/data/lbpcascades

 

  

  图像去噪方面,完善了non-local means去噪算法,虽然该算法不是实时的,但是效果相当不错。具体的可以参考网页:

  http://docs.opencv.org/trunk/modules/photo/doc/denoising.html

 

  

  在光流方面,增加了“简单流”光流算法,可以参考网页:https://github.com/Itseez/opencv/tree/master/samples/cpp/simpleflow_demo.cpp.

 

  

  CUDA方面,增加了不少GPU功能模块。

  驱动层完全对用户开放,用户现在可以使用opencv来写CUDA的驱动了;在级联分类器中支持LBP级联;加入了快速非局部均值图像去噪算法;引入了更快的积分算法;引入了霍夫圆,霍夫直线和广义霍夫变换;引入了双边滤波器;广义填水法填充连通域标注;前景背景分离算法,GMM,ViBe, GMG算法的加入;HOG类中增加了信任计算功能。

 

  

  OpenCL方面,加入了算术运算,滤波,常见的几何图形变换,光流,级联分类器,目前这些算法只能在GPU上跑。

   

  

  在OpenCV2.4.2基础上,修补了大概130个bug,这一点比较令人兴奋,bug又少了这么多。

 

  

  OpenCV现在社会推动很广,已经加入了Github,网址为:http://github.com/itseez/opencv. 在该网页上可以下载最新版本和提交各种问题。

  

  个人感受:

  从上面的趋势可以看出,OpenCV正在朝向多平台,多核,多编程语言迈进,并且不断的引入各种新的计算机视觉算法。期待2013年OpenCV2.5.0的问世!

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
ASIFT+OpenCV图像特征匹配实战VC工程源码 OpenCV包含头文件: #include "cv.h" #include "highgui.h" #include "cxcore.h" 核心代码如下: if (!m_pImage1||!m_pImage2) { AfxMessageBox("please,select 2 images!"); return; } UpdateData(TRUE); CvSize sz1 = cvSize(m_pImage1->width,m_pImage1->height); CvSize sz2 = cvSize(m_pImage2->width,m_pImage2->height); CvScalar s; IplImage *gimg1 = cvCreateImage(sz1,IPL_DEPTH_8U,1); cvCvtColor(m_pImage1,gimg1,CV_BGR2GRAY); IplImage *gimg2 = cvCreateImage(sz2,IPL_DEPTH_8U,1); cvCvtColor(m_pImage2,gimg2,CV_BGR2GRAY); size_t w1, h1; w1 = gimg1->width; h1 = gimg1->height; float * iarr1 = new float[w1*h1]; for(int i=0;i<h1;i++) { for(int j=0;j<w1;j++) { s=cvGet2D(gimg1,i,j); iarr1[i*w1+j] = s.val[0]; } } vector ipixels1(iarr1, iarr1 + w1 * h1); delete [] iarr1; size_t w2, h2; w2 = gimg2->width; h2 = gimg2->height; float * iarr2 = new float[w2*h2]; for(int i=0;i<h2;i++) { for(int j=0;j<w2;j++) { s=cvGet2D(gimg2,i,j); iarr2[i*w2+j] = s.val[0]; } } vector ipixels2(iarr2, iarr2 + w2 * h2); delete [] iarr2; float wS = IM_X; float hS = IM_Y; float zoom1=0, zoom2=0; int wS1=0, hS1=0, wS2=0, hS2=0; vector ipixels1_zoom, ipixels2_zoom; if (!m_bOrininal) { if (m_lWidth==0 || m_lHeight == 0) return; wS = m_lWidth; hS = m_lHeight; float InitSigma_aa = 1.6; float fproj_p, fproj_bg; char fproj_i; float *fproj_x4, *fproj_y4; int fproj_o; fproj_o = 3; fproj_p = 0; fproj_i = 0; fproj_bg = 0; fproj_x4 = 0; fproj_y4 = 0; float areaS = wS * hS; // Resize image 1 float area1 = w1 * h1; zoom1 = sqrt(area1/areaS); wS1 = (int) (w1 / zoom1); hS1 = (int) (h1 / zoom1); int fproj_sx = wS1; int fproj_sy = hS1; float fproj_x1 = 0; float fproj_y1 = 0; float fproj_x2 = wS1; float fproj_y2 = 0; float fproj_x3 = 0; float fproj_y3 = hS1; /* Anti-aliasing filtering along vertical direction */ if ( zoom1 > 1 ) { float sigma_aa = InitSigma_aa * zoom1 / 2; GaussianBlur1D(ipixels1,w1,h1,sigma_aa,1); GaussianBlur1D(ipixels1,w1,h1,sigma_aa,0); } // simulate a tilt: subsample the image along the vertical axis by a factor of t. ipixels1_zoom.resize(wS1*hS1); fproj (ipixels1, ipixels1_zoom, w1, h1, &fproj;_sx, &fproj;_sy, &fproj;_bg, &fproj;_o, &fproj;_p, &fproj;_i , fproj_x1 , fproj_y1 , fproj_x2 , fproj_y2 , fproj_x3 , fproj_y3, fproj_x4, fproj_y4); // Resize image 2 float area2 = w2 * h2; zoom2 = sqrt(area2/areaS); wS2 = (int) (w2 / zoom2); hS2 = (int) (h2 / zoom2); fproj_sx = wS2; fproj_sy = hS2; fproj_x2 = wS2; fproj_y3 = hS2; /* Anti-aliasing filtering along vertical direction */ if ( zoom1 > 1 ) { float sigma_aa = InitSigma_aa * zoom2 / 2; GaussianBlur1D(ipixels2,w2,h2,sigma_aa,1); GaussianBlur1D(ipixels2,w2,h2,sigma_aa,0); } // simulate a tilt: subsample the image along the vertical axis by a factor of t. ipixels2_zoom.resize(wS2*hS2); fproj (ipixels2, ipixels2_zoom, w2, h2, &fproj;_sx, &fproj;_sy, &fproj;_bg, &fproj;_o, &fproj;_p, &fproj;_i , fproj_x1 , fproj_y1 , fproj_x2 , fproj_y2 , fproj_x3 , fproj_y3, fproj_x4, fproj_y4); } else { ipixels1_zoom.resize(w1*h1); ipixels1_zoom = ipixels1; wS1 = w1; hS1 = h1; zoom1 = 1; ipixels2_zoom.resize(w2*h2); ipixels2_zoom = ipixels2; wS2 = w2; hS2 = h2; zoom2 = 1; } int num_of_tilts1 = m_lTilts1; int num_of_tilts2 = m_lTilts2; int verb = 0; // Define the SIFT parameters siftPar siftparameters; default_sift_parameters(siftparameters); vector< vector > keys1; vector< vector > keys2; int num_keys1=0, num_keys2=0; SetWindowText("Computing keypoints on the two images..."); CString str1,str2; time_t tstart, tend1,tend2; tstart = time(0); DWORD dstart = GetTickCount(); num_keys1 = compute_asift_keypoints(ipixels1_zoom, wS1, hS1, num_of_tilts1, verb, keys1, siftparameters); tend1 = time(0); m_lKeyNum1 = num_keys1; UpdateData(FALSE); str1.Format("Img1 Keypoints computation accomplished in %f s",difftime(tend1, tstart)); SetWindowText(str1); num_keys2 = compute_asift_keypoints(ipixels2_zoom, wS2, hS2, num_of_tilts2, verb, keys2, siftparameters); tend2 = time(0); m_lKeyNum2 = num_keys2; UpdateData(FALSE); str2.Format("Img2 Keypoints computation accomplished in %f s ,Matching the keypoints...",difftime(tend2, tstart)); SetWindowText(str2); //// Match ASIFT keypoints int num_matchings; matchingslist matchings; tstart = time(0); num_matchings = compute_asift_matches(num_of_tilts1, num_of_tilts2, wS1, hS1, wS2, hS2, verb, keys1, keys2, matchings, siftparameters); tend1 = time(0); DWORD dSpan = GetTickCount() - dstart; cout << "Keypoints matching accomplished in " << difftime(tend1, tstart) << " seconds." << endl; str2.Format("Keypoints matching accomplished in %f s",difftime(tend1, tstart)); SetWindowText(str2); m_lMatches = num_matchings; UpdateData(FALSE); str1.Format("Total time used:%d ms",dSpan); AfxMessageBox(str1); cvRelease((void**)&gimg1;); cvRelease((void**)&gimg2;); 参考网址:http://www.ipol.im/pub/art/2011/my-asift/

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值