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

 

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

posted @ 2018-07-10 19:42  竹夭公子  阅读(206)  评论(0编辑  收藏  举报