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

来源:互联网 发布:刘嘉玲被强奸知乎 编辑:程序博客网 时间:2024/05/18 02:01

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

开启摄像头

#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;}

这里写图片描述

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

#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;}

这里写图片描述

阅读全文
1 0
原创粉丝点击