zoukankan      html  css  js  c++  java
  • OpenCV学习(2018.7.9)

    基础知识的复习:
    首先是需要的头文件:#include<opencv2/opencv.hpp>
    这次建立一个win32控制台程序,生成的就是多文件项目了。把上面那句话写到stdafx.h里。

    应用部分的程序(cpp文件中)中需要写的句子。
    #include "stdafx.h"

    using namespace std;
    using namespace cv;

    今天学习的操作:

    waitKey(0); 程序无限制等待用户按键事件
    waitKey(1000); 1000ms
    waitKey()返回值是按键的ascii码

    任务:把摄像头获得图像的右边部分变成黑色(对像素点的访问)

     1 #include "stdafx.h"
     2 
     3 using namespace std;
     4 using namespace cv;
     5 
     6 int flag = 1; 
     7 Point p;
     8 Mat frame;
     9 
    10 int main()
    11 {
    12     VideoCapture capture; 
    13     capture.open(0);
    14     namedWindow("test");
    15 
    16     while (1)
    17     {
    18         Mat frame;
    19         capture >> frame; 
    20         for (int row = 0; row <frame.rows; row++) 
    21        for (int col = (frame.cols)/2; col < frame.cols; col++)
    22         frame.at<Vec3b>(row,col) = Vec3b(0, 0, 0);
    23 
    24         imshow("test",frame);
    25         waitKey(30);
    26         //if (waitKey(30)==32) break; //esc 27 space 32 回车13
    27         //右边一半图像变成黑色
    28     }
    29 
    30     destroyAllWindows();
    31     return 0;
    32 }             

    任务:实现鼠标交互(鼠标点击退出)

    #include "stdafx.h"
    
    using namespace std;
    using namespace cv;
    
    int flag = 1; 
    Point p;
    Mat frame;
    void OnMouse(int mouseEvent, int x, int y, int flags, void* box);//鼠标交互相关的函数
    
    int main()
    {
        namedWindow("test");
        setMouseCallback("test", OnMouse);//相当于在test这个窗口上加了一个鼠标响应功能
        VideoCapture capture;
        capture.open(0);
        while (1)
        {
            Mat frame;
            capture >> frame;
            imshow("test", frame);
            waitKey(10);
        }
        destroyAllWindows();
        return 0;
        }
    
    void OnMouse(int mouseEvent, int x, int y, int flags, void* param)
    {
        switch (mouseEvent)//mouseEvent是有保留字的,x,y是鼠标动作的坐标。flags一般不管,param是一个矩阵,可以用来传参
        {
            case CV_EVENT_LBUTTONDOWN: 
            exit(0);//退出
            break;
            default:
            break;
        }
        return;
    }    


    ///////////////////////////////////////////
    过渡任务:
    在静止画面中画圆。
    保证画面中只有一个圆。
    //////////////////////////////////////////

    任务:摄像头拍出的画面中画圆
    鼠标点击处为圆心,半径提前设置。同一时间只有一个圆。

    #include "stdafx.h"
    
    using namespace cv;
    using namespace std;
    
    int r = 20;
    Point p;
    bool drawing_box = false;
    bool gotBB = false; // got tracking box or not
    string video;
    
    void onMouse(int event, int x, int y, int flags, void *param)
    {
        switch (event)
        {
           case CV_EVENT_LBUTTONDOWN:
            p.x = x; p.y = y;
            break;
            default:
            break;
        }
    }
    
    int main(int argc, char * argv[])
    {
    
        VideoCapture capture;
        capture.open(0);;
    
        namedWindow("test");
        setMouseCallback("test", onMouse, NULL);
        Mat frame;
        capture.set(CV_CAP_PROP_FRAME_WIDTH, 800);
        capture.set(CV_CAP_PROP_FRAME_HEIGHT, 600);
    
        while (capture.read(frame))
        {
            circle(frame, p, r, 0);
            imshow("test", frame);
            if (waitKey(33) == 27) break;//按ESC退出
        }
        return 0;
    }

    任务:在摄像头传来的视频中画圆,圆的半径随鼠标拖动而变

    #include "stdafx.h"
    
    using namespace cv;
    using namespace std;
    
    Rect box; // tracking object
    int r;
    Point p;
    bool drawing = false;
    string video;
    
    
    void onMouse(int event, int x, int y, int flags, void *param)
    {
        switch (event)
        {
            case CV_EVENT_MOUSEMOVE:
            if (drawing)
            r = (int)sqrt((x - p.x)*(x - p.x) + (y - p.y)*(y - p.y));
            break;
            case CV_EVENT_LBUTTONDOWN:
            drawing = true;
            p.x = x; p.y = y;
            break;
            case CV_EVENT_LBUTTONUP:
            drawing = false;
            break;
            default:
            break;
        }
    }
    
    int main(int argc, char * argv[])
    {
    
        VideoCapture capture;
        capture.open(0);;
    
        namedWindow("test");
        setMouseCallback("test", onMouse, NULL);
        Mat frame;
        Mat first;
        capture.set(CV_CAP_PROP_FRAME_WIDTH, 800);
        capture.set(CV_CAP_PROP_FRAME_HEIGHT, 600);
    
        while (capture.read(frame))
        {
            circle(frame, p, r, 0);
            imshow("test", frame);
            if (waitKey(33) == 27) { break; }
        }
        return 0;
    }    

    拓展任务:在摄像头画面中画一个圆,让圆随鼠标点移动而移动。
    这个任务留给读者自己试验(很简单嘛)

  • 相关阅读:
    Stock Transfer I
    Negative Stock in "Stock in Transit"
    ZFINDEXITS
    Plan Driven Procurement III: Classic Scenario in SRM 5.0
    C++builder 创建进程之CreateProcess函数
    常用DOS命令
    【转】程序员的几个级别
    几本书
    OOP SOLID原则
    SSRS 使用总结
  • 原文地址:https://www.cnblogs.com/Shymuel/p/9291097.html
Copyright © 2011-2022 走看看