续前节OpenCV(C++版本)基础相关(3):滚动条操作、滚动条-传递参数、键盘响应操作、自带颜色操作、图像像素的逻辑操作
知识点:
split
(image, mv);//通道分离。image图片,mv要拆分的单通道。merge
(mv, dst);//通道合并。mv要合并的通道,dst图片。mixChannels
(&image, 1, &dst, 1, from_to, 3);//图像通道处理有关的一个函数,能够实现复杂通道的组合。image输入矩阵;1输入矩阵数量;dst输出矩阵;1输出矩阵数量;被复制通道与要复制到的位置组成的索引对;3表示fromTo中索引对的数目,即3个通道。#include
using namespace cv;
class QuickDemo //QuickDemo对象
{
public:
void channels_demo(Mat &imge);
};
#include
#include
void QuickDemo::channels_demo(Mat &image)
{
std::vector<Mat>mv;
split(image, mv);
//imshow("蓝色", mv[0]);
//imshow("绿色", mv[1]);
//imshow("红色", mv[2]);
Mat dst;
mv[1] = 0;
mv[2] = 0;
merge(mv, dst);
namedWindow("蓝色", WINDOW_KEEPRATIO);
imshow("蓝色", dst); //在窗口显示图像
resizeWindow("蓝色", 320, 480);
int from_to[] = {0,2,1,1,2,0 };
mixChannels(&image, 1, &dst, 1, from_to, 3);//3表示3个通道
namedWindow("通道混合", WINDOW_KEEPRATIO);
imshow("通道混合", dst); //在窗口显示图像
resizeWindow("通道混合", 320, 480);
}
#include
#include
#include
using namespace std;
using namespace cv;
int main(int argc,char **argv)
{
Mat src = imread("D:/opencv/pictures/11 (8).jpeg", IMREAD_ANYCOLOR);//B,G,R蓝绿红通道图像
if (src.empty())
{
printf("could not load image"); //如果路径不正确,则显示无法导入图片。
return -1;
}
namedWindow("输入窗口", WINDOW_KEEPRATIO);
imshow("输入窗口", src); //在窗口显示图像
resizeWindow("输入窗口", 320, 480);
QuickDemo qd; //调用之前创建的类对象
qd.channels_demo(src);
waitKey(0); //暂停程序,等待一个按键输入,单位ms
destroyAllWindows(); //销毁所有创建的窗口
return 0;
}
知识点:
inRange
(hsv, Scalar(35, 43, 46), Scalar(77, 255, 255), mask);#include
using namespace cv;
class QuickDemo //QuickDemo对象
{
public:
void inrange_demo(Mat &imge);
};
#include
#include
void QuickDemo::inrange_demo(Mat &image)
{
Mat hsv;
cvtColor(image, hsv, COLOR_BGR2HSV);
Mat mask;
inRange(hsv, Scalar(35, 43, 46), Scalar(77, 255, 255), mask);
namedWindow("mask", WINDOW_KEEPRATIO);
imshow("mask", hsv); //在窗口显示图像
resizeWindow("mask", 320, 480);
//Mat redback = Mat::zeros(image.size(), image.type());
//redback = Scalar(40, 40, 200);//
//bitwise_not(mask, mask);
//namedWindow("mask", WINDOW_KEEPRATIO);
//imshow("mask", mask); //在窗口显示图像
//resizeWindow("mask", 320, 480);
//image.copyTo(redback, mask);//把redback复制到mask,mask通过inRange得到。
//namedWindow("roi区域提取", WINDOW_KEEPRATIO);
//imshow("roi区域提取", redback); //在窗口显示图像
//resizeWindow("roi区域提取", 320, 480);
}
#include
#include
#include
using namespace std;
using namespace cv;
int main(int argc,char **argv)
{
Mat src = imread("D:/opencv/pictures/11 (8).jpeg", IMREAD_ANYCOLOR);//B,G,R蓝绿红通道图像
if (src.empty())
{
printf("could not load image"); //如果路径不正确,则显示无法导入图片。
return -1;
}
namedWindow("输入窗口", WINDOW_KEEPRATIO);
imshow("输入窗口", src); //在窗口显示图像
resizeWindow("输入窗口", 320, 480);
QuickDemo qd; //调用之前创建的类对象
qd.inrange_demo(src);
waitKey(0); //暂停程序,等待一个按键输入,单位ms
destroyAllWindows(); //销毁所有创建的窗口
return 0;
}
知识点:
minMaxLoc
(mv[i], &minv, &maxv, &minLoc, &maxLoc, Mat());//求出图像的最大值和最小值。meanStdDev
(image, mean, stddev);//求图像的均值和方差#include
using namespace cv;
class QuickDemo //QuickDemo对象
{
public:
void pixel_statistic_demo(Mat &imge);
};
#include
#include
void QuickDemo::pixel_statistic_demo(Mat &image)
{
double minv, maxv;//定义最小、最大值
Point minLoc, maxLoc;//定义最小、最大值的地址
std::vector<Mat>mv;//定义一个Mat类型的数组容器:mv
split(image, mv);//对通道分割
for (int i = 0; i < mv.size(); i++)
{
//遍历
minMaxLoc(mv[i], &minv, &maxv, &minLoc, &maxLoc, Mat());//求出图像的最大值和最小值。
std::cout << "No.channels:" << i << " minvalue:" << minv << " maxvalue:" << maxv << std::endl;//打印各个通道的数值
}
Mat mean, stddev;//定义均值和方差
meanStdDev(image, mean, stddev);//求图像的均值和方差
std::cout << "mean:" << mean << std::endl;//打印均值
std::cout << "stddev:" << stddev << std::endl;//打印方差
}
#include
#include
#include
using namespace std;
using namespace cv;
int main(int argc,char **argv)
{
Mat src = imread("D:/opencv/pictures/11 (8).jpeg", IMREAD_ANYCOLOR);//B,G,R蓝绿红通道图像
if (src.empty())
{
printf("could not load image"); //如果路径不正确,则显示无法导入图片。
return -1;
}
namedWindow("输入窗口", WINDOW_KEEPRATIO);
imshow("输入窗口", src); //在窗口显示图像
resizeWindow("输入窗口", 320, 480);
QuickDemo qd; //调用之前创建的类对象
qd.pixel_statistic_demo(src);
waitKey(0); //暂停程序,等待一个按键输入,单位ms
destroyAllWindows(); //销毁所有创建的窗口
return 0;
}
知识点:
Rect rect
;//定义一个对象rect,用来存储一个矩形框的左上角坐标、宽度和高度
rectangle
(image, rect, Scalar(0, 0, 255), -1, 8, 0);//image代表待处理的图片,rect代表矩形坐标和宽高;Scalar(0, 0, 255)代表颜色;-1代表填充;8代表8连接;0为默认。
circle
(bg, Point(350, 400), 15, Scalar(0, 255, 0), -1, 8, 0);//bg代表图像;Point(350, 400)代表圆心坐标;15半径;Scalar(0, 255, 0)代表颜色;-1为填充;8为领域填充;0为默认;
line
(bg, Point(100, 100), Point(350, 400), Scalar(0, 0, 255), 8, LINE_AA, 0);//bg代表图像;Point(350, 400)代表起点坐标;Point(350, 400)为终点坐标;Scalar(0, 255, 0)代表颜色;LINE_AA为抗锯齿线。
RotatedRect rtt
;//定义一个对象,用于存储旋转矩形。包括矩形中心,矩形长宽,旋转角度。
ellipse
(bg, rtt, Scalar(0, 0, 255), 2, 8);//椭圆函数。
#include
using namespace cv;
class QuickDemo //QuickDemo对象
{
public:
void drawing_demo(Mat &imge);
};
#include
#include
void QuickDemo::drawing_demo(Mat &image)
{
/*绘图演示1*/
Rect rect;
rect.x = 100;
rect.y = 100;
rect.width = 250;
rect.height = 300;
Mat bg = Mat::zeros(image.size(), image.type());
rectangle(image, rect, Scalar(0, 0, 255), -1, 8, 0);
circle(bg, Point(350, 400), 15, Scalar(0, 255, 0), -1, 8, 0);
line(bg, Point(100, 100), Point(350, 400), Scalar(0, 0, 255), 8, LINE_AA, 0);
Mat dst;
addWeighted(image, 0.7, bg, 0.3, 0, dst);
namedWindow("绘图演示1", WINDOW_KEEPRATIO);
imshow("绘图演示1", dst); //在窗口显示图像
resizeWindow("绘图演示1", 320, 480);
/*绘图演示2*/
//Rect rect;
//rect.x = 100;
//rect.y = 100;
//rect.width = 250;
//rect.height = 300;
//Mat bg = Mat::zeros(image.size(), image.type());
//rectangle(image, rect, Scalar(0, 0, 255), -1, 8, 0);
//circle(bg, Point(350, 400), 15, Scalar(0, 255, 0), -1, 8, 0);
//line(bg, Point(100, 100), Point(350, 400), Scalar(0, 0, 255), 8, LINE_AA, 0);
//RotatedRect rtt;
//rtt.center = Point(200, 200);
//rtt.size = Size(100, 200);
//rtt.angle = 0.0;
//line(bg, Point(100, 100), Point(350, 400), Scalar(0, 0, 255), 8, LINE_AA, 0);
//ellipse(bg, rtt, Scalar(0, 0, 255), 2, 8);
//Mat dst;
//addWeighted(image, 0.7, bg, 0.3, 0, dst);
//namedWindow("绘图演示2", WINDOW_KEEPRATIO);
//imshow("绘图演示2", dst); //在窗口显示图像
//resizeWindow("绘图演示2", 320, 480);
}
#include
#include
#include
using namespace std;
using namespace cv;
int main(int argc,char **argv)
{
Mat src = imread("D:/opencv/pictures/11 (8).jpeg", IMREAD_ANYCOLOR);//B,G,R蓝绿红通道图像
if (src.empty())
{
printf("could not load image"); //如果路径不正确,则显示无法导入图片。
return -1;
}
namedWindow("输入窗口", WINDOW_KEEPRATIO);
imshow("输入窗口", src); //在窗口显示图像
resizeWindow("输入窗口", 320, 480);
QuickDemo qd; //调用之前创建的类对象
qd.drawing_demo(src);
waitKey(0); //暂停程序,等待一个按键输入,单位ms
destroyAllWindows(); //销毁所有创建的窗口
return 0;
}
知识点:
RNG
rng(12345);//RNG为随机生成函数,用于产生随机数,12345为随机种子。对于一个伪随机数生成器,从相同的随机数种子出发,可以得到相同的随机数序列。rng.uniform
(0, 255);//在(0,255)区间,随机生成一个整数#include
using namespace cv;
class QuickDemo //QuickDemo对象
{
public:
void random_drawing();
};
#include
#include
void QuickDemo::random_drawing()
{
Mat canvas = Mat::zeros(Size(512, 512), CV_8UC3);//创建底图画布
int w = canvas.cols;
int h = canvas.rows;
RNG rng(12345);//产生随机数
while (true)
{
int c = waitKey(10);
if (c == 27)
{
break;//退出
}
int x1 = rng.uniform(0, canvas.cols);//坐标点1
int y1 = rng.uniform(0, h);
int x2 = rng.uniform(0, canvas.cols);// 坐标点2
int y2 = rng.uniform(0, h);
int b = rng.uniform(0, 255);// 随机颜色
int g = rng.uniform(0, 255);
int r = rng.uniform(0, 255);
//canvas = Scalar(0, 0, 0);//每次清零
line(canvas, Point(x1, y1), Point(x2, y2), Scalar(b, g, r), 1, LINE_AA, 0);//绘制线段
imshow("随机绘制演示", canvas);
}
}
#include
#include
#include
using namespace std;
using namespace cv;
int main(int argc,char **argv)
{
Mat src = imread("D:/opencv/pictures/11 (8).jpeg", IMREAD_ANYCOLOR);//B,G,R蓝绿红通道图像
if (src.empty())
{
printf("could not load image"); //如果路径不正确,则显示无法导入图片。
return -1;
}
namedWindow("输入窗口", WINDOW_KEEPRATIO);
imshow("输入窗口", src); //在窗口显示图像
resizeWindow("输入窗口", 320, 480);
QuickDemo qd; //调用之前创建的类对象
qd.random_drawing();
waitKey(0); //暂停程序,等待一个按键输入,单位ms
destroyAllWindows(); //销毁所有创建的窗口
return 0;
}