基础知识的复习:
首先是需要的头文件:#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;
}
拓展任务:在摄像头画面中画一个圆,让圆随鼠标点移动而移动。
这个任务留给读者自己试验(很简单嘛)
原文:https://www.cnblogs.com/Shymuel/p/9291097.html