毕业设计过程记录三,开启摄像头和霍夫曼圆检测

做opencv最基础的就是利用摄像头进行实时图像处理。这在后面会有许多的用处。

例如一段简单的开启摄像头的代码:

 

#include "stdafx.h"  
#include   
#include   
#include   
   
int main( int argc, char** argv )  
{  
  //声明IplImage指针  
  IplImage* pFrame = NULL;  
  
 //获取摄像头  
  CvCapture* pCapture = cvCreateCameraCapture(1);  
   
  //创建窗口  
  cvNamedWindow("video", 1);  
   
  //显示视屏  
  while(1)  
  {  
      pFrame=cvQueryFrame( pCapture );  
      if(!pFrame)break;  
      cvShowImage("video",pFrame);  
      char c=cvWaitKey(33);  
      if(c==27)break;  
  }  
  cvReleaseCapture(&pCapture);  
  cvDestroyWindow("video");  
}  

在其中很重要的是  CvCapture* pCapture = cvCreateCameraCapture(1);一般情况下cvCreateCameraCapture()中传入的为0,表示电脑自带摄像头,还有的是1表示USB摄像头,当然还有-1-,OpenCV会打开一个窗口让用户选择需要使用的摄像机。

 

霍夫曼圆是opencv库中一个检测圆形的小函数在条件良好的情况下,几乎可以检测所有的圆形。

这段代码就是霍夫曼圆的示例:

 

#include   
#include   

using namespace cv;

int main()
{
    //开起摄像头
    VideoCapture capture;
    capture.open(1);


    Mat edges;  //定义转化的灰度图
    if (!capture.isOpened())
        return -1;
    namedWindow("效果图", CV_WINDOW_NORMAL);
    while (1)
    {
        Mat frame;
        capture >> frame;
        if (!frame.data)
            return -1;
        cvtColor(frame, edges, CV_BGR2GRAY);
        //高斯滤波
        GaussianBlur(edges, edges, Size(7, 7), 2, 2);
        vector circles;
        //霍夫圆
        HoughCircles(edges, circles, CV_HOUGH_GRADIENT, 1.5, 10, 200, 100, 0, 0);
        for (size_t i = 0; i < circles.size(); i++)
        {
            Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
            int radius = cvRound(circles[i][2]);
            //绘制圆心  
            circle(frame, center, 3, Scalar(0, 255, 0), -1, 8, 0);
            //绘制圆轮廓  
            circle(frame, center, radius, Scalar(155, 50, 255), 3, 8, 0);
        }


        imshow("效果图", frame);


        waitKey(30);

    }

    return 0;
}

opencv的学习很丰富很好玩!
 

二次编辑(2017、9、16)

因工作需要,写了一个可以找多个圆的相似程序,一起发上来了,其中注释掉了一些窗口

#include "stdafx.h"
#include 
#include  
using namespace cv;  
using namespace std;  
  
const int kvalue = 15;//双边滤波邻域大小  
  
int main()  
{  
    VideoCapture capture;
    capture.open(0);
    wihle(1)
{
    if(!capture.isOpened()) return -1;
    namedWindow("xiaoguotu",CV_WINDOW_NORMAL);

    Mat frame;//shipinliu
    capture>>frame;
    if(!frame.data)return -1;

    //声明一个三通道图像,像素值全为0,用来将霍夫变换检测出的圆画在上面  
    Mat dst(frame.size(), frame.type());  
    dst = Scalar::all(0);  
  
    Mat edges;//彩色图像转化成灰度图  
    cvtColor(frame, edges, COLOR_BGR2GRAY);   
  
    Mat bf;//对灰度图像进行双边滤波  
    bilateralFilter(edges, bf, kvalue, kvalue*2, kvalue/2); 
 
    //声明一个向量,保存检测出的圆的圆心坐标和半径 
    vector circles;

    //霍夫变换检测圆
    HoughCircles(bf, circles, CV_HOUGH_GRADIENT, 1.5, 20, 130, 38, 10, 50);  
  
    cout << "x=\ty=\tr=" << endl;  
    for(size_t i = 0; i < circles.size(); i++)//把霍夫变换检测出的圆画出来  
    {  
        Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));  
        int radius = cvRound(circles[i][2]);  
        //在dst绘制圆心  
        circle( dst, center, 0, Scalar(0, 255, 0), -1, 8, 0 );  
        //在dst绘制圆 ,dst可更换为frame或者edges 
        circle( dst, center, radius, Scalar(0, 0, 255), 1, 8, 0 );  
  
        cout << cvRound(circles[i][0]) << "\t" << cvRound(circles[i][1]) << "\t"   
             << cvRound(circles[i][2]) << endl;//在控制台输出圆心坐标和半径                
    }  
  }
    imshow("三通道", dst);  
    //imshow("正常图像", frame);
    //imshow("灰度化", edges);
   
  
    waitKey(30);  
}  

 

具体效果如下图:

 

毕业设计过程记录三,开启摄像头和霍夫曼圆检测_第1张图片

你以为我会告诉你,我的圆点图是用WORD画的,天真!!!!!!!!!

 

 

你可能感兴趣的:(毕业设计)