OpenCv学习笔记

原创 2013年12月05日 21:59:11

    11月份有一个项目需要用到手势识别功能,google之,大爱OpenCv,记录下自己的学习历程,让我们为互联网的开源精神Cheers.

   

    项目采用Qt + Opencv + win7环境下实现 

  

 一、

   首先我们要 win7下配置OpenCV的Qt开发环境,具体参考如下

  http://blog.csdn.net/qiurisuixiang/article/details/8665278

   当你的test code 成功实现一张图片显示的时候,congratulate you,你的环境已经搭建成功了。

二、

   做完初步的环境搭建,让我们来做一些好玩的事情,实现对一个物体的背景轮廓分离。这里我采用了大津算法,初步实现了背景和背景的分离。

   贴Code

  

#include"cv.h"
#include"cxcore.h"
#include"highgui.h"


void cvThresholdOtsu(IplImage* src, IplImage* dst)
{
    int height=src->height;
    int width=src->width;


    //histogram
    float histogram[256]={0};
    for(int i=0;i<height;i++)
    {
        unsigned char* p=(unsigned char*)src->imageData+src->widthStep*i;
        for(int j=0;j<width;j++)
        {
            histogram[*p++]++;
        }
    }
    //normalize histogram
    int size=height*width;
    for(int i=0;i<256;i++)
    {
        histogram[i]=histogram[i]/size;
    }


    //average pixel value
    float avgValue=0;
    for(int i=0;i<256;i++)
    {
        avgValue+=i*histogram[i];
    }


    int threshold;
    float maxVariance=0;
    float w=0,u=0;
    //自适应阈值
    for(int i=0;i<256;i++)
    {
        w+=histogram[i];
        u+=i*histogram[i];


        float t=avgValue*w-u;
        float variance=t*t/(w*(1-w));
        if(variance>maxVariance)
        {
            maxVariance=variance;
            threshold=i;
        }
    }


    cvThreshold(src,dst,threshold,255,CV_THRESH_BINARY);//设置阈值
}


void cvSkinOtsu(IplImage* src, IplImage* dst)
{
    assert(dst->nChannels==1&& src->nChannels==3);
    IplImage* ycrcb=cvCreateImage(cvGetSize(src),8,3);
    IplImage* cr=cvCreateImage(cvGetSize(src),8,1);
    cvCvtColor(src,ycrcb,CV_BGR2YCrCb);
    cvSplit(ycrcb,0,cr,0,0);


    cvThresholdOtsu(cr,cr);
    cvCopyImage(cr,dst);
    cvReleaseImage(&cr);
    cvReleaseImage(&ycrcb);
}


int main(int argc,char *argv[])
{
    IplImage *src=cvLoadImage("E:/hand.jpg",1);
    IplImage *binary_img=cvCreateImage(cvGetSize(src),8,1);
    cvSkinOtsu(src, binary_img);
    CvMemStorage *pcvMStorage = cvCreateMemStorage();
    CvSeq *pcvSeq = NULL;
    cvFindContours(binary_img, pcvMStorage, &pcvSeq, sizeof(CvContour),\
                       CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0, 0));


    IplImage *pOutlineImage = cvCreateImage(cvGetSize(binary_img), IPL_DEPTH_8U, 3);
    cvDrawContours(pOutlineImage, pcvSeq, CV_RGB(255,0,0), CV_RGB(0,255,0), 5, 2);


    cvNamedWindow("Image",1);
    cvNamedWindow("binary",1);
    cvNamedWindow("end",1);


    cvShowImage("Image",src);
    cvShowImage("binary",binary_img);
    cvShowImage("end", pOutlineImage);


    cvWaitKey(0);
    cvDestroyWindow("Image");
    cvReleaseImage(&src);
    cvDestroyWindow("binary");
    cvReleaseImage(&binary_img);
    cvDestroyWindow("end");
    cvReleaseImage(&pOutlineImage);
    return 0;
}

 

通过以上代码我们可以实现初步的轮廓提取,贴上一张图



具体的实现算法google之,简要概括就是通过类间方差识别出手掌和背景的分离指标,用这个算出手掌和背景的分离阈值,从而对图像二值化,最后使用cvFindContours对二值化图像寻找轮廓显示。未完待续。


OpenCV学习笔记大集锦

转载自: OpenCV学习笔记大集锦 – 视觉机器人 http://www.cvrobot.net/collect-opencv-resource-learn-study-note-chinese...
  • qq_26898461
  • qq_26898461
  • 2016年01月06日 09:49
  • 1423

opencv——实现目标模板匹配

#include #include int main( int agrc,char* argv[]) { //templat为目标模板图像,为彩色图像 IplImage* templat = ...
  • sinat_21119417
  • sinat_21119417
  • 2014年10月02日 21:30
  • 788

学习OpenCV的学习笔记系列(三)显示图片及视频

OpenCV是计算机视觉库,那么处理的对象无非两个:“图片”及“视频”(其实视频也是被解压成单帧图像来处理的,总的来说,还是处理图像)。 那么要想学习OpenCV,第一步必须知道OpenCV是怎么打开...
  • bestgonghuibin
  • bestgonghuibin
  • 2014年09月04日 20:50
  • 1443

opencv学习笔记(1)-opencv安装

1.opencv版本的选择
  • q6541oijhk
  • q6541oijhk
  • 2014年10月30日 11:10
  • 600

OpenCV学习笔记启动摄像头

OpenCV启动摄像头的资料 #include 02.#include 03.#include 04. 05.using namespace cv; 06. 07. ...
  • BBZZ2
  • BBZZ2
  • 2016年11月16日 11:48
  • 311

OpenCV学习笔记-图像分割

图像分割,采用金字塔实现,该函数为,PyrSegmentation 用金字塔实现图像分割 void cvPyrSegmentation( IplImage* src, IplImage* dst, ...
  • superdont
  • superdont
  • 2011年08月04日 23:18
  • 9859

我的OpenCV学习笔记(1):空域滤波之中值滤波

中值滤波就是将当前像素值替换为模板覆盖范围内的所有像素值中大小居中那一个:对于一个3*3的模板,第5大的就是中值: (10,15,20,20,20,20,20,25,100) 中值滤波使得...
  • chenligong
  • chenligong
  • 2014年10月15日 13:27
  • 297

Opencv学习——图像及视频读取

Opencv的图像读取有C和C++接口的,由于C接口涉及到指针操作,需要对指针进行管理。而C++接口就比较简单了,本文也主要以C++接口来进行图像操作。Opencv2.0版本后新增了Mat操作,相比之...
  • Dangkie
  • Dangkie
  • 2017年04月30日 16:39
  • 408

OpenCV学习笔记(1)—— 摄像机模型与标定2

摄像机和眼睛的成像原理差不多,这个过程大概可以描述为:光线从物体表面反射后通过透镜到达眼睛和摄像机,为视网膜或图像采集器吸收。由此我们可以将这种现象简化为最简单的一种模型——针孔摄像机模型。   根据...
  • tongbiaos
  • tongbiaos
  • 2015年08月10日 00:01
  • 1040

【OpenCV学习笔记】二十三、模板匹配及应用

模板匹配及应用 1.模版匹配——matchTemplate() 2.实现了几个小应用:图像单目标模板匹配、视频单目标模板匹配、多目标模板匹配 先上ppt: ...
  • abc8730866
  • abc8730866
  • 2017年03月30日 15:01
  • 1499
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OpenCv学习笔记
举报原因:
原因补充:

(最多只允许输入30个字)