【OpenCV学习笔记】2:开启摄像头和对捕获到的图像的处理

以前有些过于循序渐进了,很浪费时间,以后代码注解尽量写在注释里,简明清晰。

开启摄像头

#include "cv.h" //opencv核心函数库
#include "highgui.h"    //GUI函数库

//主方法(注意在VS下的形参表)
int main(int argc, char** argv) 
{
    //创建窗口(窗口名,窗口属性标志)
    //int cvNamedWindow(const char* name, int flags=CV_WINDOW_AUTOSIZE);
    cvNamedWindow("win");

    //CvCapture结构体,用来保存图像捕获的信息
    //cvCreateCameraCapture(int index);初始化从摄像头中获取视频,只有一个摄像头时索引号取0
    CvCapture* capture = cvCreateCameraCapture(0);

    //IplImage是表示一个图像的结构体
    IplImage* frame;

    //在死循环中
    while (1)
    {
        //cvQueryFrame从摄像头或者文件中抓取一帧,然后解压并返回这一帧
        frame = cvQueryFrame(capture);

        //抓取失败时返回值为NULL
        //失败常是因摄像头索引号不对或刚初始化就抓取帧(摄像头启动需要时间)
        if (NULL==frame)
            break;  //抓取失败就退出吧

        //在指定窗口中显示图像(已创建的窗口名,被显示的图像)
        //void cvShowImage( const char* name, const CvArr* image );
        cvShowImage("win", frame);

        //当delay小于等于0的时候,如果没有键盘触发,则一直等待,此时的返回值为-1
        //否则返回值为键盘按下的码字
        //当delay大于0时,如果没有键盘的的触发,则等待delay毫秒,此时的返回值是-1
        //否则返回值为键盘按下的码字
        //int cvWaitKey( int delay=0 );
        char c = cvWaitKey(50);

        //如果返回值为27(ESC的ASCII码)
        if (c == 27)
            break;//退出循环
    }

    //cvReleaseCapture:释放CvCapture结构开辟的内存空间
    cvReleaseCapture(&capture);

    //cvDestroyWindow:销毁一个指定名称的窗口
    cvDestroyWindow("win");

    return 0;
}

【OpenCV学习笔记】2:开启摄像头和对捕获到的图像的处理_第1张图片

原图->灰度图->二值化

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

int main(int argc, char** argv) 
{
    //创建窗口(窗口名,窗口属性标志)
    cvNamedWindow("捕获的原图");
    cvNamedWindow("转灰度图后");
    cvNamedWindow("再二值化后");

    //CvCapture结构体,用来保存图像捕获的信息
    CvCapture* capture = cvCreateCameraCapture(0);
    //IplImage是表示一个图像的结构体
    IplImage* frame;

    while (true)
    {

        /**----摄像头->原图----**/
        //抓取并返回一帧
        frame = cvQueryFrame(capture);
        //抓取失败
        if (NULL==frame)
            break;

        /**----灰度图和二值化图的空间开辟----**/
        //创建图像分配存储空间(图像尺寸,图像深度,通道数);
        //IplImage* cvCreateImage(CvSize cvSize(int width, int height), int depth, int channels);
        //这里IPL_DEPTH_8U是8位无符号整数
        IplImage *dst_grey = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 1);
        IplImage *dst_binary = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 1);

        /**----原图->灰度图----**/
        //颜色空间转换(输入图像,输出图像,转换码);
        //void cvCvtColor( const CvArr* src, CvArr* dst, int code );
        //这里 CV_BGR2GRAY是从RGB转灰度图
        cvCvtColor(frame, dst_grey, CV_BGR2GRAY);

        /**----灰度图->二值化----**/
        //对单通道数组应用固定阈值操作(输入图像,输出图像,阈值,最大值,阈值类型);
        //void cvThreshold( const CvArr* src, CvArr* dst, double threshold, double max_value, int threshold_type );
        //这里CV_THRESH_OTSU则函数会使用OTSU大律法寻找阈值,不再用自己写的阈值120
        cvThreshold(dst_grey, dst_binary, 120, 255, CV_THRESH_OTSU);

        /**----在指定窗口中显示图像----**/
        cvShowImage("捕获的原图", frame);
        cvShowImage("转灰度图后", dst_grey);
        cvShowImage("再二值化后", dst_binary);

        //等50ms或有按键
        char c = cvWaitKey(50);
        //按ESC时退出
        if (c == 27)
        {
            //释放空间
            cvReleaseImage(&dst_binary);
            cvReleaseImage(&dst_grey);
            break;
        }
    }

    //释放空间
    cvReleaseImage(&frame);
    cvReleaseCapture(&capture);
    //销毁全部窗口
    cvDestroyAllWindows();
    return 0;
}

【OpenCV学习笔记】2:开启摄像头和对捕获到的图像的处理_第2张图片

你可能感兴趣的:(OpenCV)