zoukankan      html  css  js  c++  java
  • OpenCV —— HighGUI

    分为:硬件相关部分,文件部分以及图形用户接口部分

    创建窗口 —— cvNamedWindow

    若设置成 CV_WINDOW_AUTOSIZE 窗口大小会随着图像的载入而根据图像大小调整,用户没办法手动调整窗口大小

    设置成 0 ,随意调整

    cvDestoyWindow   cvDestroyAllWindows

    cvGetWindowHandle   cvGetWindowName

    cvLoadImage  读入16位的彩色图像 —— CV_LOAD_IMAGE_COLOR | CV_LOAD_IMAGE_ANYDEPTH


    鼠标事件相应采用回调函数的方式处理

    CvMouseCallback

    cvSetMouseCallback —— 注册到窗口(产生事件的窗口)

    #include <cv.h>
    #include <highgui.h>
    
    CvRect box;
    bool drawing_box = false;
    void my_mouse_callback(int event,int x,int y,int flags,void* param);
    
    void draw_box(IplImage* img,CvRect rect)
    {
        cvRectangle(img,cvPoint(box.x,box.y),cvPoint(box.x+box.width,box.y+box.height),cvScalar(0xff,0x00,0x00));
    }
    
    int main(int argc,char** argv)
    {
        box=cvRect(-1,-1,0,0);
        
        IplImage* img=cvCreateImage(cvSize(200,200),IPL_DEPTH_8U,3);
        cvZero(img);
        IplImage* temp=cvCloneImage(img);
    
        cvNamedWindow("w1");
    
        cvSetMouseCallback("w1",my_mouse_callback,(void*)img);
    
        while(1)
        {
            cvCopyImage(img,temp);
            if(!drawing_box)
                draw_box(temp,box);
            cvShowImage("w1",temp);
    
            if(cvWaitKey(15)==27)
                break;
        }
    
        cvReleaseImage(&img);
        cvReleaseImage(&temp);
        cvDestroyWindow("w1");
    
        return 0;
    }
    
    
    void my_mouse_callback(int event,int x,int y,int flags,void* param)
    {
        IplImage* img=(IplImage*)param;
    
        switch(event)
        {
        case CV_EVENT_MOUSEMOVE:
            {
                if(drawing_box)
                {
                    box.width=x-box.x;
                    box.height=y-box.y;
                }
            }
            break;
        case CV_EVENT_LBUTTONDOWN:
            {
                drawing_box=true;
                box=cvRect(x,y,0,0);
            }
            break;
        case CV_EVENT_LBUTTONUP:
            {
                drawing_box=false;
                if(box.width<0)
                {
                    box.x+=box.width;
                    box.width*=-1;
                }
                if (box.height<0)
                {
                    box.y+=box.height;
                    box.height*=-1;
                }
                draw_box(img,box);
            }
            break;
            
        }
    }

    sliders —— trackbar 滑动条   cvCreateTrackbar  回调函数

    cvGetTrackbarPos   cvSetTrackbarPos  —— 读取设置滑动条的取值

    OpenCV 不提供任何形式的按钮,用只有两个状态的滑动条来代替

    #include <cv.h>
    #include <highgui.h>
    
    int g_switch_value =0;
    IplImage* img;
    IplImage* temp;
    
    void Switch_callback(int position)
    {
        if(position==0)
        {
            cvShowImage("w1",img);
        }else
        {
            cvShowImage("w1",temp);
        }
    }
    
    int main(int argc,char** argv)
    {
        cvNamedWindow("w1",CV_WINDOW_AUTOSIZE);
        cvCreateTrackbar("Switch","w1",&g_switch_value,1,Switch_callback);
        img=cvLoadImage("wukong.jpg",CV_LOAD_IMAGE_UNCHANGED);
        temp=cvLoadImage("test.jpg",CV_LOAD_IMAGE_UNCHANGED);
    
        while(1)
        {
            if (cvWaitKey(15)==27)
                break;
        }
    
        cvDestroyWindow("w1");
        return 0;
    }

    视频处理

    CvCapture —— 从摄像机或视频文件中读取帧所需要的信息

    cvCreateFileCapture    cvCreateCameraCapture —— 为了使视频可以被成功读入,必须确保这种视频解码库已经安装在系统中

    cvCreateCameraCapture  -1 时,Opencv会打开一个窗口让用户选择

    读视频

    cvGrabFrame(快速将视频帧读入内存,下一次调用时,指针所指向的空间会被新的图像覆盖,如果想做特殊处理需要先复制到其他地方。此内存空间由Opencv管理,不要去释放)   cvRetrieveFrame   cvQueryFrame(是cvGrabFrame 与 cvRetrieveFrame 的组合)

    对一个视频文件,当调用 cvGrabFrame ,视频帧会自动前进一步,下一次调用会自动读入下一帧视频

    cvReleaseCapture

    cvGetCaptureProperty

    cvVideoWriter 写视频 —— 不显式地释放写入结构,视频文件可能会被损坏 —— cvReleaseVideoWriter

    HighGUI 中茕茕孑立的一个函数 —— ConvertImage (用于在不同图像格式之间转换 , 可以垂直旋转图像 —— 有时候摄像机图像格式与图像显示格式会反转)

  • 相关阅读:
    double 和 int 同时存在时的运算
    快速排序
    案例:商品放大镜效果
    淘宝flexible.js源码分析
    案例:模态框拖拽
    Web APIs——BOM
    案例:获取URL参数数据
    案例:5秒之后自动跳转页面
    JS中this指针的指向
    按钮:点击发送短信按钮60秒内不能再次点击的功能
  • 原文地址:https://www.cnblogs.com/sprint1989/p/3806077.html
Copyright © 2011-2022 走看看