Opencv学习day02
出入每天学习点OpenCV,做做计算机视觉项目
前言
为了项目与论文需要,现在入门 OpenCV4学习,并且学习点深度学习的东西,希望有助于自身论文的研究,只是为了毕业。。。
一、内容
1.图像通道分离
通道分离:
void split(const mat& src, mat* mvbegin
void split(InputArray m, OutputArrayOfArrays mv)
第一个参数,inputarray类型的m或者const mat&类型的src,填我们需要进行分离的多通道数组。
第二个参数,outputarrayofarrays类型的mv,填函数的输出数组或者输出的vector容器
通道合并:
void merge(InputArrayOfArrays mv, OutputArray dst);
第一个参数,mv。填需要被合并的输入矩阵或vector容器的阵列,这个mv参数中所有的矩阵必须有着一样的尺寸和深度。
第二个参数,dst。即输出矩阵,和mv[0]拥有一样的尺寸和深度
void OpenCV_quick_day01Demo::chanel_split(Mat &image) {
std::vector<Mat> mv;
split(image, mv);//分离出各个通道
imshow("蓝色", mv[0]);
imshow("绿色", mv[1]);
imshow("红色",mv[2]);
//显示
Mat dst;
mv[0] = 0;//消除第一通道
mv[1] = 0;//消除第二通道
merge(mv, dst);
imshow("红色",dst);
/*mv[0] = 0;//消除第一通道
mv[2] = 0;//消除第三通道
merge(mv, dst);
imshow("绿色", dst);*/
/*mv[1] = 0;//消除第二通道
mv[2] = 0;//消除第三通道
merge(mv, dst);
imshow("蓝色", dst);*/
}
2.视频的调用
void OpenCV_quick_day01Demo::camera_demo() {
//VideoCapture vc(0);//0表示电脑本机摄像头
VideoCapture vc;
vc.open(0);//
while (1) {
Mat frame;
vc >> frame;
imshow("调用摄像头",frame);
waitKey(30);
}
}
3.摄像头调用
void OpenCV_quick_day01Demo::camera_demo() {
//VideoCapture vc(0);//0表示电脑本机摄像头
VideoCapture vc;
vc.open(0);//
while (1) {
Mat frame;
vc >> frame;
imshow("调用摄像头",frame);
waitKey(30);
}
}
4.几种打印输出格式
void OpenCV_quick_day01Demo::cout_demo() {
Mat m = Mat(3, 3, CV_8UC3);
randu(m, Scalar(0), Scalar(255));
cout << "m = " << m << endl;
cout << "m =[python风格] " << format(m,Formatter::FMT_PYTHON) << endl;
cout << "m =[numpy风格] " << format(m, Formatter::FMT_NUMPY) << endl;
cout << "m = [逗号风格] " << format(m, Formatter::FMT_CSV) << endl;
}
5.基本图形的绘制
椭圆绘制:
void ellipse(InputOutputArray img, Point center, Size axes,
double angle, double startAngle, double endAngle,
const Scalar& color, int thickness = 1,
int lineType = LINE_8, int shift = 0);
InputOutputArray img, 被绘制的图像
Point center, 椭圆中心
Size axes, 长轴与短轴的长度
double angle, 旋转角度
double startAngle, 开始画的角度
double endAngle, 结束的角度
const Scalar& color, 椭圆颜色
int thickness = 1, 椭圆线宽,默认为1 ,-1时封闭图形将填充
int lineType = LINE_8,线型
int shift = 0
圆型绘制:
void circle(InputOutputArray img, Point center, int radius,
const Scalar& color, int thickness = 1,
int lineType = LINE_8, int shift = 0);
int radius 圆半径
其他同上
直线绘制:
void line(InputOutputArray img, Point pt1, Point pt2, const Scalar& color,
int thickness = 1, int lineType = LINE_8, int shift = 0);
Point pt1, 直线起点
Point pt2 直线终点
多边形绘制:
void fillPoly(InputOutputArray img, const Point** pts,
const int* npts, int ncontours,
const Scalar& color, int lineType = LINE_8, int shift = 0,
Point offset = Point() );
const Point** pts, 指向多个多边形顶点的数组的列表;
const int* npts, 多边形的顶点个数的数组。
int ncontours, 组成填充区域的数量
void OpenCV_quick_day01Demo::drawBasicImage(Mat &image) {
cout << image.cols <<" "<< image.rows;
//ellipse 在image上绘制椭圆
ellipse(image,Point(200,200),Size(80,50),0,0,360,Scalar(220,175,0),5,8);
//circle 在image上绘制圆
circle(image, Point(100, 100), 50, Scalar(175, 100, 100), 2, 4);
//绘制多边形
Point rookPoints[1][5] = {Point(50,20),Point(80,100),Point(100,150),Point(40,220),Point(60,180)};
const Point* ppt[1] = { rookPoints[0] };
int npt = 5;
fillPoly(image, ppt, &npt,1,Scalar(20,80,90),8);
//绘制直线
line(image, Point(50, 50), Point(200, 300), Scalar(220, 125, 220));
imshow("draw", image);
}