// 图像像素值统计
void CV120201012Dlg::pixel_statistic()
{
Mat m = imread("E:\\壁纸\\微信图片_20200610160556.jpg");
if (m.empty())
{
MessageBox(_T("图像加载失败!"), _T("error"));
return;
}
// 获取图像每个通道像素的最大值和最小值以及位置点
// 将图像分离成3个单通道
std::vector<Mat> img;
split(m, img);
double min, max;
Point minLoc, maxLoc;
for (int i = 0;i < img.size();i++)
{
// 获取
minMaxLoc(img[i],&min,&max,&minLoc,&maxLoc,Mat());
}
// 获取图像像素的平均值和方差
Mat mean, stddev;
meanStdDev(m,mean,stddev,Mat());
}
// 图像几何形状绘制
void CV120201012Dlg::drawDemo()
{
Mat m = imread("E:\\壁纸\\微信图片_20200610160556.jpg");
if (m.empty())
{
MessageBox(_T("图像加载失败!"), _T("error"));
return;
}
// 在图像上绘制矩形
Rect rec;
rec.x = 100; // 横坐标
rec.y = 100; // 纵坐标
rec.width = 50; // 宽 50
rec.height = 50; // 高 50
rectangle(m,rec,Scalar(0,255,255),-1,8,0);
// 绘制圆形
Point p; // 圆心坐标
p.x = 120;
p.y = 120;
circle(m,p,3,Scalar(255,255,0),-1,8,0);
//绘制 线
Point p1, p2; // 起点和终点
p1.x = 50;
p1.y = 50;
p2.x = 100;
p2.y = 100;
line(m,p1,p2,Scalar(34,45,100),4,LINE_AA,0);
// 绘制椭圆形
//RotatedRect rr;
//rr.center.x = 100.0;
//rr.center.y = 100.0;
//rr.size = Size(30, 50);
//rr.angle = 45;
//ellipse(m,rr,Scalar(90,90,90),-1,8);
// 定义一张黑图,将两张图像进行合并
Mat img = Mat::zeros(m.size(),m.type());
img = Scalar(255,255,255);
Mat dst;
addWeighted(m,0.7,img,0.3,0,dst);
imshow("绘制图像",dst);
}
// 随机图像绘制
void CV120201012Dlg::randomDraw()
{
// 定义一张背景板
Mat img = Mat(Size(300,300), CV_8UC3);
img = Scalar(0, 0, 0);
// 定义随机数
RNG randomnum(12345);
while (1)
{
int key = waitKey(10);
if (key == 27)
break;
int x = randomnum.uniform(0,300); //左上点的横坐标
int y = randomnum.uniform(0, 300); //右上点的纵坐标
int w = randomnum.uniform(0, 300); //左下点的横坐标
int h = randomnum.uniform(0, 300); //右下点的纵坐标
int b = randomnum.uniform(0, 255); // 3 个颜色值
int g = randomnum.uniform(0, 255);
int r = randomnum.uniform(0, 255);
// 画线
line(img,Point(x,y),Point(w,h),Scalar(b, g, r),1,LINE_AA,0);
//显示
imshow("随机图像",img);
}
}
// 绘制多边形
void CV120201012Dlg::mutiplyDraw()
{
// 定义一张背景板
Mat img = Mat(Size(800, 800), CV_8UC3);
img = Scalar(0, 0, 0);
// 定义5个顶点坐标
Point p1(439, 126);
Point p2(466, 198);
Point p3(546, 198);
Point p4(482, 244);
Point p5(507, 316);
Point p6(439, 275);
Point p7(371,316);
Point p8(396,244);
Point p9(330, 198);
Point p10(414, 198);
// 将5个坐标放入一个容器中
std::vector<Point> vecp;
vecp.push_back(p1);
vecp.push_back(p2);
vecp.push_back(p3);
vecp.push_back(p4);
vecp.push_back(p5);
fillPoly(img,vecp,Scalar(255,0,0),8,0);
polylines(img,vecp,true,Scalar(0,0,255),2,LINE_AA,0);
std::vector<std::vector<Point>> contours;
contours.push_back(vecp);
//drawContours(img, contours, -1,Scalar(0,255,0),-1);
imshow("多边形绘制",img);
}
涉及到的 opencv函数详解,参见https://blog.csdn.net/L946494/article/details/109211790