1. 图像绘制
1.1 基本图像属性
1.1.1 画点Point()
2种方式画点:
// 1. 使用构造函数
Point pt = Point(x, y);
// 2. 先定义类对象,再赋值
Point pt;
pt.x = 10;
pt.y = 8;
1.1.2 颜色标量Scalar()
表示一个4元素的向量;常用于传递像素值,也常用于表示BGR颜色值,BGR只有3个参数。所以scalar最后1个可以不传参。示例Scalar(0,0,255)。
1.1.3 设置尺寸Size()
设置与索引示例:
// 1. 使用
Size size(width, height);
// 2. 索引
a = size.width
b = size.height
1.2 基本图形绘制
1.2.1 绘制直线
示例:
line(img, point1, point2, color, thickness, lineType)
// 图像,点1,点2,颜色,厚度,线型
// color使用Scalar()传参
1.2.2 绘制矩形
示例如下:
rectangle(img, point1, point2, color, lineType)
// lineType通常为4或8,不传参默认为8
// point1 左上角坐标
// point2 右下角坐标
1.2.3 绘制圆形
示例:
circle(img, center, radius, color, thickness, lineType)
// center: 圆心坐标,使用Point定义
1.2.4 绘制椭圆
示例:
ellipse(img, center, Size(width, height), angle, 0, 360, color, thickness, lineType)
// angle:偏移角度,例如设为0°,30°
// 0,360: 顺时针从x轴正向绘制360完整椭圆
1.2.5 基本图形绘制示例
绘制线条、矩形、圆形、椭圆:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
Mat image = Mat::zeros(Size(600, 800), CV_8UC3); // 创建空白图像
image.setTo(255); // 背景设为白色
Point pt1(100, 100);
Point pt2(300, 450);
cv::line(image, pt1, pt2, Scalar(0, 0, 240), 2);
cv::rectangle(image, pt1, pt2, Scalar(120, 0, 0));
cv::circle(image, pt1, 50, Scalar(0, 180, 0));
cv::ellipse(image, pt2, Size(50, 30), 0, 0, 270, Scalar(255, 0, 255), 2);
imshow("绘制图形", image);
waitKey(0);
destroyAllWindows();
return 0;
}
效果:
2. 计算机交互
2.1 鼠标绘图
使用鼠标在图像上绘制矩形,鼠标左键按下点至鼠标左键释放点绘制矩形:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
Point pt; // 获取点坐标一定要设为全局变量
void onMouse(int event, int x, int y, int flags, void* para)
{
Mat img = *(Mat *)para;
switch (event)
{
case cv::EVENT_LBUTTONDOWN:
pt.x = x;
pt.y = y;
break;
case cv::EVENT_LBUTTONUP:
rectangle(img, pt, Point(x, y), Scalar(0, 0, 255));
break;
default:
break;
}
}
int main()
{
Mat img(300, 300, CV_8UC3, Scalar(255, 255, 255));
namedWindow("鼠标绘制矩形", WINDOW_AUTOSIZE);
setMouseCallback("鼠标绘制矩形", onMouse, &img);
while (true)
{
imshow("鼠标绘制矩形", img);
if (waitKey(30) == 27)
{
break;
}
}
}
效果如下:
【改进】:上述代码中只有等鼠标释放后才能出现矩形,能不能看到移动过程中的绘制轨迹?
答:需要实时显示move中的最新矩形并刷新显示界面。
2.2 滑动条bar
通过鼠标移动,选择需要的取值。使用滑动条实现图片缩放:
#include <opencv/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int val = 1;
Mat src, dst;
void back(int, void*) // 设置回调函数
{
// 设置一下长和宽的数值
Size dsize = Size(src.cols * val / 5, src.rows * val / 5);
dst = Mat(dsize, CV_32S);
resize(src, dst, dsize); // 更改长和宽的数值
imshow("slide image", dst); // 如果需要显示图片需要在回调函数中设置好
}
int main()
{
namedWindow("origin image", WINDOW_AUTOSIZE);
src = imread("D:/Project_Images/panda.jpg");
imshow("origin image", src);
namedWindow("slide bar", WINDOW_AUTOSIZE);
createTrackbar("滑动调节", "slide bar", &val, 5, back);
back(val, 0);
waitKey(0);
}
效果: