HardBirch

移动设备上使用opencv 1.10做图像识别的例子

时间:10-07-09 栏目:安卓入门与提高 作者:张飞不张,文采横飞 评论:52 点击: 24,492 次

       上次说到了如何  在WINCE/WM移植Opencv1.10,  这次就说说如何在WM手机上使用裁剪移植后的Open1.10的例子,在opencv上使用OpenSURF(OpenSURF在GoogleCode的地址:http://code.google.com/p/opensurf1/),先来看看本文程序运行的截图: 

左图为SURF算法找出的特征点,右图为两个图像相似特征点的匹配。

      本文的代码可以到http://www.rayfile.com/zh-cn/files/da4d4edc-8af5-11df-9dac-0015c55db73d/这里下载,代码里包含了自己实现的MyHighGUI类,用于转换/绘制/保存IplImage图像,也包含了同时支持WINCE/WIN32的第三方BMP操作类库----DIBSectionCE类(详见http://www.codeguru.com/cpp/w-p/ce/bitmapsandthegdi/article.php/c3),接下来就贴出部分操作代码:












void CtestDlg::OnBnClickedButton1()
{
//自定义的HighGUI,详见MyHighGUI.h
MyHighGUI gui;
//网上的BMP操作类,支持WINCE/WIN32,地址:http://www.codeguru.com/cpp/w-p/ce/bitmapsandthegdi/article.php/c3
CDIBSectionCE ce;
//step1:读取BMP,并转换为IplImage格式
CString bmpPath=GetCurrentDirectory()+L"car1.bmp";
ce.Load(bmpPath);
int nChannels = ce.GetBitmapInfo()->bmiHeader.biBitCount /8 ;
IplImage* img = gui.BMP2Ipl((BYTE*)ce.GetDIBits(),ce.GetWidth(),ce.GetHeight(),nChannels);
ce.DeleteObject();

//step2:提取图片中的特征点
IpVec ipts;
surfDetDes(img, ipts, false, 3, 4, 2, 0.0004f);

// step3:画出特征点
drawIpoints(img, ipts);
gui.Show(img,::GetDC(this->m_hWnd),0,0,img->width,img->height);
//gui.WriteBmp(L"img33.bmp",(BYTE *)img->imageData,img->imageSize,img->width,img->height);
img=NULL;
}

void CtestDlg::OnBnClickedButton2()
{
//自定义的HighGUI,详见MyHighGUI.h
MyHighGUI gui;
//网上的BMP操作类,支持WINCE/WIN32,地址:http://www.codeguru.com/cpp/w-p/ce/bitmapsandthegdi/article.php/c3
CDIBSectionCE ce;
//step1:读取BMP,并转换为IplImage格式
CString bmpPath=GetCurrentDirectory()+L"car1.bmp";
ce.Load(bmpPath);
int nChannels = ce.GetBitmapInfo()->bmiHeader.biBitCount /8 ;
IplImage* img1 = gui.BMP2Ipl((BYTE*)ce.GetDIBits(),ce.GetWidth(),ce.GetHeight(),nChannels);
ce.DeleteObject();

bmpPath=GetCurrentDirectory()+L"car2.bmp";
ce.Load(bmpPath);
nChannels = ce.GetBitmapInfo()->bmiHeader.biBitCount /8 ;
IplImage* img2 = gui.BMP2Ipl((BYTE*)ce.GetDIBits(),ce.GetWidth(),ce.GetHeight(),nChannels);
ce.DeleteObject();

//step2:提取图片中的特征点
IpVec ipts1, ipts2;
surfDetDes(img1,ipts1,false,4,4,2,0.0002f);
surfDetDes(img2,ipts2,false,4,4,2,0.0002f);

//step3:特征点匹配
IpPairVec matches;
getMatches(ipts1,ipts2,matches);

//step4:画出匹配的特征点,并且连线
for (unsigned int i = 0; i < matches.size(); ++i)
{
drawPoint(img1,matches[i].first);
drawPoint(img2,matches[i].second);

int w = img1->width;
cvLine(img1,cvPoint(matches[i].first.x,matches[i].first.y),cvPoint(matches[i].second.x+w,matches[i].second.y), cvScalar(123,123,123),1);
cvLine(img2,cvPoint(matches[i].first.x-w,matches[i].first.y),cvPoint(matches[i].second.x,matches[i].second.y), cvScalar(123,123,123),1);
}

//画到屏幕上
if(img1->height>img2->height)
{
gui.Show(img1,::GetDC(this->m_hWnd),0,0,img1->width,img1->height);
gui.Show(img2,::GetDC(this->m_hWnd),img1->width,img1->height-img2->height,img2->width,img2->height);
}
else
{
gui.Show(img1,::GetDC(this->m_hWnd),0,img2->height-img1->height,img1->width,img1->height);
gui.Show(img2,::GetDC(this->m_hWnd),img1->width,0,img2->width,img2->height);
}

}

用户可以根据本文的操作代码,在WINCE/WM平台上实现更多Opencv例子,不过,本文程序跑起来很慢(我用的是460MHz的K3方案 WM手机),因为只用标准C的Math做运算处理。在ARM9+DSP或者ARM11等手机上使用Opencv,建议在Opencv的运算部分用上这些手机的专用运算指令,这样可以大大提高运算速度。

声明: 本文由( 张飞不张,文采横飞 )原创编译,转载请保留链接: 移动设备上使用opencv 1.10做图像识别的例子

移动设备上使用opencv 1.10做图像识别的例子:目前有52 条留言

  1. [e01]

    2010-07-09 10:09 [回复]
  2. 被逼着来顶

    2010-07-09 10:12 [回复]
  3. [e01]不得不顶一下啊

    2010-07-09 10:18 [回复]
  4. 0楼
    aki_studio:

    [e01]

    2010-07-09 10:23 [回复]
  5. [e01]

    2010-07-09 11:49 [回复]
  6. 在首页 怎么好像没人看的?

    2010-07-10 00:51 [回复]
  7. 0楼
    wangli820:

    wchar_t pBuf[256];

    …….
    delete pBuf;

    能这么用吗?你程序没崩溃?

    2010-07-10 09:37 [回复]
  8. 0楼
    hellogv:

    回复 wangli820:
    运行好好地

    2010-07-10 09:39 [回复]
  9. 0楼
    hellogv:

    回复 wangli820:
    恩,这个问题发现的好,3Q,虽然没崩溃,不过还是改过来了。

    2010-07-10 09:53 [回复]
  10. openCV是个好东西

    2010-07-10 10:36 [回复]
  11. 0楼
    wangli820:

    [e01]

    2010-07-10 11:19 [回复]
  12. [e08]

    2010-07-10 12:44 [回复]
  13. 0楼
    fsyiyun:

    [e01][e01]

    2010-07-10 20:26 [回复]
  14. [e01]Cheap Hockey jersey,NHL jersey,NFL jersey(http://www.nhlonlineshop.com)

    2010-07-11 09:42 [回复]
  15. 哈哈,你也用的K3的手机啊。
    460其实只有300吧。

    文章不错,极有参考价值。
    谢谢。

    2010-07-11 18:49 [回复]
  16. 0楼
    hellogv:

    回复 匿名用户:
    没办法。。。。穷,只买得起K3的智能机。。。。

    2010-07-11 19:14 [回复]
  17. 0楼
    vslinux:

    [e01][e01][e01]

    2010-07-12 10:35 [回复]
  18. 0楼
    e513479333:

    好文 谢谢CSDN

    2010-07-12 14:05 [回复]
  19. 0楼
    mcba100:

    定顶 好文不的不顶

    2010-07-13 11:51 [回复]
  20. [e01]

    2010-07-13 14:03 [回复]
  21. 0楼
    jix1987:

    [e01]

    2010-07-13 16:09 [回复]
  22. 0楼
    lanmeng221:

    [e01][e01][e01]

    2010-07-14 08:35 [回复]
  23. 0楼
    info_he:

    顶一个[e01]

    2010-07-14 10:21 [回复]
  24. 0楼
    dodowater:

    [e01][e01][e01][e01][e01]

    2010-07-14 11:15 [回复]
  25. 0楼
    kpfwolf:

    [e01] 好文顶了

    2010-07-14 17:54 [回复]
  26. [e01]

    2010-07-14 22:18 [回复]
  27. 0楼
    FansHill:

    cv.h 是哪里的?

    2010-07-16 16:28 [回复]
  28. 0楼
    FansHill:

    已经添加了,怎么还是无法识别?

    2010-07-16 17:10 [回复]
  29. 很厉害啊![e01]

    2010-09-03 15:10 [回复]
  30. 你好,张国威
    我把你的OpenSURF_MFC程序修改一下引用路径,编译通过后运行时为什么会出现 OpenCV Error,每次运行OpenCV函数就会出现这个错误,cvd.lib和cvcored.lib都是用了你自带的lib_ppc里的库

    2010-09-13 09:28 [回复]
  31. 这个运行时出现错误提示 OpenCV GUI Error Handler

    2010-09-13 09:57 [回复]
  32. 0楼
    hellogv:

    回复 xiaowen0228:
    请确保路径正确

    2010-09-13 11:59 [回复]
  33. 回复 hellogv:检查过路径没问题,否则编译不会通过,PPC 2003使用了仿真平台,我换了一个wince平台 同步开发板调试,同样也是会弹出对话框,显示那个错误

    2010-09-13 14:48 [回复]
  34. 0楼
    hellogv:

    回复 xiaowen0228:
    http://www.rayfile.com/zh-cn/files/da4d4edc-8af5-11df-9dac-0015c55db73d/

    到这里下载例子,编译运行,看看行不行

    2010-09-13 15:43 [回复]
  35. 回复 hellogv:我下载试过了,同样的问题,好郁闷,难道是我的win7系统影响的?在你那里这个程序完全没问题吧,OpenCV的函数都能兼容wince?

    2010-09-13 20:48 [回复]
  36. 回复 hellogv:对了,不知方不方便把你运行通过的程序发给我,dongguo.wen@ce2tek.com 不胜感激!

    2010-09-13 20:50 [回复]
  37. 0楼
    hellogv:

    回复 xiaowen0228:
    我用的是VS2005

    2010-09-14 08:57 [回复]
  38. 0楼
    FansHill:

    回复 hellogv:明白了[e04]

    2010-09-17 14:26 [回复]
  39. 回复 hellogv:你好,之前那个问题解决了,不能在线调试,只能放到wince系统上才能跑起来,然后我想请教一个问题:就是CDIBSectionCE Load的数据和cvLoadImage 两个buffer数据为什么会不同?

    2010-09-20 08:49 [回复]
  40. 回复 hellogv:除去Header以后的图像像素数据

    2010-09-20 08:50 [回复]
  41. 0楼
    hellogv:

    回复 xiaowen0228:
    wince不支持cvLoadImage,我才自己封装一个读取库的

    2010-09-20 10:24 [回复]
  42. 回复 hellogv:这个我知道,但你封装读取库支持win32,在win32的平台上进行了数据比较差距很大,不知道是什么原因引起的,不知道cvLoadImage有么有重新排列过数据

    2010-09-21 08:56 [回复]
  43. 0楼
    hellogv:

    回复 xiaowen0228:
    cvLoadImage用了WINCE/WM不支持的API,我能用cvLoadImage难道我还要自己封装么?

    2010-09-21 09:01 [回复]
  44. 回复 hellogv:终于找到问题所在了,CDIBSectionCE Load的数据cvLoadImage 数据正好是翻转过来的,用cvFlip解决了,谢谢你。

    2010-09-21 14:55 [回复]
  45. 0楼
    kay226:

    回复 FansHill:哥们,我还是不明白,能否解释一下.谢谢!

    2010-11-16 22:13 [回复]
  46. 0楼
    kay226:

    OpenCV GUI Error Handler 老出现这个错误!

    2010-11-17 11:55 [回复]
  47. 0楼
    hellogv:

    回复 kay226:
    请确保你的图片是BMP格式,然后再用本文的DEMO程序去运行

    2010-11-17 11:57 [回复]
  48. 0楼
    kay226:

    回复 hellogv:我已经确认我的图片是BMP格式了,因为用的就是DEMO里的samples呢,指纹和卡车呢啊,不过还是不对.

    2010-11-22 11:25 [回复]
  49. 0楼
    kay226:

    博主你好!谢谢你的例子。我还有个问题,在手机上(800MHZ+150RAM)按下BUTTON1之后处理一幅图片要9秒(兴趣点有314个),而在描述上面就花了有8秒,而如果在电脑上用SURF算法处理同样一幅图片(只是JPG格式的),总共花了1秒多一点,而描述只用了一半多一点的时间,这个时间花费的比例不对称。博主说说你的意见吧。

    2011-01-04 15:41 [回复]
  50. 0楼
    s19870730y:

    博主,同楼上的问题。google上的那个程序为什么特征向量描述用了那么久的时间,surfDetDes相比于surfDet时间开销多了几倍,是不是surf.cpp程序不合理造成的?

    2011-05-03 10:19 [回复]
  51. 0楼
    hellogv:

    回复 kay226:
    看两个操作的花销比例

    2011-05-03 10:32 [回复]

发表评论


QQ群互动

Linux系统与内核学习群:194051772

WP建站技术学习交流群:194062106

魔豆之路QR

魔豆的Linux内核之路

魔豆的Linux内核之路

优秀工程师当看优秀书籍

优秀程序员,要看优秀书!

赞助商广告

友荐云推荐