OpenCv常用函数实例

简介: OpenCv常用函数实例
 /** 
* Real Time Eye Tracking and Blink Detection with OpenCV 
* 
* @author Nash <me@nashruddin.com> 
* @license GPL 
* @website http://nashruddin.com 
* 
* See the tutorial at 
* http://nashruddin.com/Real_Time_Eye_Tracking_and_Blink_Detection 
*/ 
#include <stdio.h>   
#include "cv.h"   
#include "highgui.h"   
#pragma comment(lib,"highgui.lib")
#pragma comment(lib,"cv.lib")
#pragma comment(lib,"cxcore.lib")
void GetColor();
int GetFace();  
void GetCup();
int main(int argc, char** argv)   
{     
  //GetColor(img);
  //GetFace(img);  
  GetCup();
  cvWaitKey(0);
  system("pause");
  return 0;   
}   
void GetCup()
{
  cvNamedWindow("GetCup",CV_WINDOW_AUTOSIZE);
  IplImage *img1=cvLoadImage("img1.jpg");
  IplImage *img2=cvLoadImage("img2.jpg");
  IplImage *diff=cvCreateImage(cvSize(img1->width,img1->height),img1->depth,img1->nChannels);
  cvSub(img1,img2,diff);///背景差
  IplImage *gray=cvCreateImage(cvSize(img1->width,img1->height),8,1);
  cvCvtColor(diff,gray,CV_BGR2GRAY);//转化为8位灰度
  cvThreshold(gray,gray,32,255, CV_THRESH_BINARY);//二值化
  IplConvKernel*    kernel; 
  kernel = cvCreateStructuringElementEx(3, 3, 1, 1, CV_SHAPE_CROSS, NULL);   
  cvMorphologyEx(gray,gray,NULL,kernel,CV_MOP_OPEN,7);///开运算
  /查找最大面积轮廓
  CvMemStorage*    storage;
  CvSeq* comp=0;
  storage = cvCreateMemStorage(0);
  cvFindContours(gray,storage,&comp,sizeof(CvContour));
  double maxArea=0;
  CvRect maxRect;
  maxRect.x=0;
  maxRect.y=0;
  maxRect.width=0;
  maxRect.height=0;
  for(;comp != 0;)
  {
    double area=fabs(cvContourArea(comp));
    if(area>maxArea)
    {
      CvRect r=cvBoundingRect(comp,1);
      maxRect.x=r.x;
      maxRect.y=r.y;
      maxRect.width=r.width;
      maxRect.height=r.height;      
    }
    comp=comp->h_next;
  }
    画矩形
//  CvPoint a,c;
//  a.x=maxRect.x;  
//  a.y=maxRect.y;
//  c.x=maxRect.x+maxRect.width;
//  c.y=maxRect.y+maxRect.height;
//  cvRectangle(img2,a,c,CV_RGB(255,0,0),2,8);
  /面积最大区域 复制
    cvSetImageROI(img2,maxRect);
  IplImage *maxAreaImg;
  maxAreaImg=cvCreateImage(cvSize(maxRect.width,maxRect.height),8,3);
  cvCopy(img2,maxAreaImg);
  cvResetImageROI(img2);
  漫水法颜色填充
  CvPoint seedPoint;
  seedPoint.x=0;
  seedPoint.y=0;
  CvScalar newVal;
  newVal.val[0]=0;
  newVal.val[1]=0;
  newVal.val[2]=0;
  CvScalar loDiff = cvScalarAll(2);
  CvScalar upDiff = cvScalarAll(203);  
  cvNamedWindow("GetCup2",CV_WINDOW_AUTOSIZE);
  cvShowImage("GetCup2",img2);
  CvConnectedComp conComp;
  cvFloodFill(img2,seedPoint,newVal,loDiff,upDiff,&conComp);///漫水法填充,并返回区域轮廓
  CvPoint a,b;
  a.x=conComp.rect.x;
  a.y=conComp.rect.y;
  b.x=conComp.rect.x+conComp.rect.width;
  b.y=conComp.rect.y+conComp.rect.height;     
  cvRectangle(img2,a,b,CV_RGB(255,0,0),2,8);
  cvShowImage("GetCup",img2);
  ///
}
int GetFace()   
{  
  IplImage *img=cvLoadImage("face.jpg");
  cvNamedWindow("testF", CV_WINDOW_AUTOSIZE);
  cvNamedWindow("testF2", CV_WINDOW_AUTOSIZE);
  cvNamedWindow("testF3", CV_WINDOW_AUTOSIZE);
  IplImage *img2;
  img2=cvCreateImage(cvSize(img->width,img->height),img->depth,img->nChannels);
  img2=cvCloneImage(img);
  CvSeq* comp=0;
  CvMemStorage*    storage;
  storage = cvCreateMemStorage(0);  
  CvSeq* comp2=0;
  CvMemStorage*    storage2;
  storage2 = cvCreateMemStorage(0);  
  IplConvKernel*    kernel; 
  kernel = cvCreateStructuringElementEx(3, 3, 1, 1, CV_SHAPE_CROSS, NULL);   
  if (!storage)   
    printf("cannot allocate memory storage!");   
    IplImage* _diff;   
  IplImage* diff;
  diff=cvCreateImage(cvSize(img->width,img->height),img->depth,1);
  cvCvtColor(img,diff,CV_BGR2GRAY);//灰度图
    cvThreshold(diff,diff, 127, 255, CV_THRESH_BINARY);   //二值化
  cvShowImage("testF",diff);
  cvMorphologyEx(diff, diff, NULL, kernel, CV_MOP_OPEN, 7);//闭运算
   _diff = cvCloneImage(diff); 
  int nface=cvFindContours(_diff, storage, &comp, sizeof(CvContour),CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));   //查轮廓
  printf("%d\n",nface);
  for(int i=0;comp != 0;i=i+100)
  {
    CvRect r = cvBoundingRect(comp, 1); 
    double area=fabs(cvContourArea(comp,CV_WHOLE_SEQ));
    printf("%lf\n",area);
    printf("width=%d  height=%d\n",r.width,r.height);
    CvPoint a,c;
    a.x=r.x;  
    a.y=r.y;
    c.x=r.x+r.width;
    c.y=r.y+r.height;
    cvRectangle(img2,a,c,CV_RGB(255,0,0),2,8);
    cvShowImage("testF3",img2);
    //
    cvSetImageROI(diff,r);
    cvFindContours(diff, storage2, &comp2, sizeof(CvContour),CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));   //查轮廓
    for(;comp2 != 0;)
    {
      CvRect r2=cvBoundingRect(comp2,1);
      CvPoint a2,c2;
      a2.x=r2.x+r.x;  
      a2.y=r2.y+r.y;
      c2.x=r2.x+r2.width+r.x;
      c2.y=r2.y+r2.height+r.y;
      cvRectangle(img,a2,c2,CV_RGB(255,i,i/6),2,8);
      cvShowImage("testF2",img);
      comp2=comp2->h_next;
    }
    cvWaitKey(100);
    cvResetImageROI(diff);
    comp = comp->h_next; 
  }
    return 0;   
}   
///提取颜色
void GetColor()
{
  IplImage *img=cvLoadImage("face.jpg");
  IplImage*   pImg_test = img;
  int r, g, b;
  int intS = 0;
  IplImage* newImg;
  newImg=cvCreateImage(cvSize(img->width,img->height),img->depth,img->nChannels);
  cvNamedWindow("test",CV_WINDOW_AUTOSIZE);
  for(int x = 0; x < pImg_test->width; x++)
  {
    for(int y = 0; y < pImg_test->height; y++) 
    {
      r = CV_IMAGE_ELEM(pImg_test, uchar, y, x * 3 + 2);
      g = CV_IMAGE_ELEM(pImg_test, uchar, y, x * 3 + 1);
      b = CV_IMAGE_ELEM(pImg_test, uchar, y, x * 3);
      if (r >= 210) 
      {
        CvScalar val;
        val.val[0]=r;
        val.val[1]=g;
        val.val[2]=b;
        cvSet2D(newImg,y,x,val);
      }
    }
  }
cvShowImage("test",newImg);
printf("ok");
}
相关文章
|
3月前
|
监控 API 计算机视觉
OpenCV这么简单为啥不学——1.3、图像缩放resize函数
OpenCV这么简单为啥不学——1.3、图像缩放resize函数
47 0
|
7月前
|
计算机视觉
OpenCV-图像翻转函数cv::filp
OpenCV-图像翻转函数cv::filp
|
3月前
|
人工智能 Linux API
OpenCV这么简单为啥不学——1.1、图像处理(灰度图、模糊图片、GaussianBlur函数、提取边缘、边缘膨胀、边缘细化)
OpenCV这么简单为啥不学——1.1、图像处理(灰度图、模糊图片、GaussianBlur函数、提取边缘、边缘膨胀、边缘细化)
48 0
|
7月前
|
计算机视觉 C++
OpenCV-计时函数cv::getTickCount&cv::getTickFrequency
OpenCV-计时函数cv::getTickCount&cv::getTickFrequency
|
3月前
|
监控 算法 Serverless
OpenCV这么简单为啥不学——1.12、使用ssim函数对两张照片进行相似度分析
OpenCV这么简单为啥不学——1.12、使用ssim函数对两张照片进行相似度分析
50 0
|
3月前
|
监控 API 计算机视觉
OpenCV这么简单为啥不学——1.6、图像旋转与翻转(rotate函数、imutils环境安装、imutils任意角度旋转)
OpenCV这么简单为啥不学——1.6、图像旋转与翻转(rotate函数、imutils环境安装、imutils任意角度旋转)
35 0
|
3月前
|
监控 API 计算机视觉
OpenCV这么简单为啥不学——1.4、基础标识绘制(绘制线line函数、rectangle函数绘制四边形、circle函数绘制圆形、putText函数绘制文字、putText绘制中文文字)
OpenCV这么简单为啥不学——1.4、基础标识绘制(绘制线line函数、rectangle函数绘制四边形、circle函数绘制圆形、putText函数绘制文字、putText绘制中文文字)
32 0
|
3月前
|
监控 API 计算机视觉
OpenCV这么简单为啥不学——2、逐帧播放视频(VideoCapture函数、waitKey函数、0xFF == ord(‘1‘))
OpenCV这么简单为啥不学——2、逐帧播放视频(VideoCapture函数、waitKey函数、0xFF == ord(‘1‘))
34 0
|
3月前
|
监控 API 图形学
OpenCV这么简单为啥不学——1、基础环境与imread函数
OpenCV这么简单为啥不学——1、基础环境与imread函数
32 0
|
5月前
|
计算机视觉 Python
OpenCV中阈值处理函数和二值化、反二值化的讲解及实战(附Python源码)
OpenCV中阈值处理函数和二值化、反二值化的讲解及实战(附Python源码)
112 0