OpenCV4 C++ 快速入门视频30讲 - 系列合集 源代码(B站:OPENCV学堂)

【个人笔记 - 目录】OpenCV4 C++ 快速入门 30讲 个人笔记 - 目录 OpenCV4 C++ 快速入门 30讲 阅读详情

目录

B站视频《OpenCV4 C++ 快速入门视频30讲 - 系列合集》

quickdemo.cpp

quickopencv.h

test440.cpp


B站视频《OpenCV4 C++ 快速入门视频30讲 - 系列合集》

下面为该课程中的全部源代码,纯手打,如有错误和其他问题,欢迎留言(涉及到的权重和图片代码等文件,如果需要请看评论区)

quickdemo.cpp

#include <quickopencv.h>

void QuickDemo::colorSpace_Demo(Mat & image)
{
	Mat gray, hsv;
	cvtColor(image,hsv,COLOR_BGR2HSV);
	cvtColor(image,gray,COLOR_BGR2GRAY);
	imshow("HSV",hsv);
	// H 范围0-180 ,S V通道0-255
	//HS表示颜色 V表示亮度
	//S可调整饱和度
	imshow("灰度",gray);
	imwrite("D:/opencvproject/Project32015/Lednahsv.jpg", hsv);
	imwrite("D:/opencvproject/Project32015/Lednagray.jpg", gray);
}

void QuickDemo::mat_Creation_demo(Mat &image) {
	//Mat m1, m2;
	//m1 = image.clone();
	//image.copyTo(m2);

	//创建空白图像

	Mat m3 = Mat::zeros(Size(8,8),CV_8UC3);
	// zeros可换为ones ,但是注意 创建出来的三通道并不是全都是1,只有第一个通道B为1,其余为零
	// 可用  Scalar(?,?,?);  为各个通道赋值

	// CV_8UC3 表示8位 无符号数 3通道
	std::cout << "宽度 " << m3.cols << "   高度:" << m3.rows << "   channels:" << m3.channels() << std::endl;
	std::cout << m3 << std::endl;

}

void QuickDemo::pixel_visit_demo(Mat &image) {
	int w = image.cols;
	int h = image.rows;
	int dims = image.channels();
	/*
	for (int row = 0; row < h; row++) {
		for (int col = 0; col < w; col++) {
			if (dims == 1) { //灰度图像
				int pv = image.at<uchar>(row, col);
				image.at<uchar>(row, col) = 255 - pv;

			}
			if (dims == 3) { //彩色图像
				Vec3b bgr = image.at<Vec3b>(row, col);
				image.at<Vec3b>(row, col)[0] = 255 - bgr[0];
				image.at<Vec3b>(row, col)[1] = 255 - bgr[1];
				image.at<Vec3b>(row, col)[2] = 255 - bgr[2];
			}
		}
	}
	*/
	//下面使用指针方法
	for (int row = 0; row < h; row++) {
		uchar *current_row = image.ptr<uchar>(row);
		for (int col = 0; col < w; col++) {
			if (dims == 1) { //灰度图像
				int pv = *current_row;
				*current_row++ = 255 - pv;

			}
			if (dims == 3) { //彩色图像
				Vec3b bgr = image.at<Vec3b>(row, col);
				*current_row++ = 255 - *current_row;
				*current_row++ = 255 - *current_row;
				*current_row++ = 255 - *current_row;
			}
		}
	}

	imshow("像素读写演示", image);
}

void QuickDemo::operators_demo(Mat &image) {
	Mat dst;
	dst = image + Scalar(50,50,50);
	imshow("像素加减",dst);
}

void QuickDemo::testsubt(Mat &image0, Mat &image1) {
	Mat dst,dst2;
	subtract(image0,image1,dst);
	add(image1, dst, dst2);
	imshow("无雾减有雾图像相减",dst);

	imwrite("dst.jpg", dst);
	imshow("有雾气图像加相减结果", dst2);
	imwrite("dst2.jpg", dst2);
}

Mat src, dst, m;
int lightness = 50;


static void on_lightness(int b ,void * userdata) {
	Mat image = *((Mat*)userdata);
	Mat dst = Mat::zeros(image.size(), image.type());
	Mat m = Mat::zeros(image.size(), image.type());
	//m = Scalar(b, b, b);
	//suaddbtract(src, m, dst);
	addWeighted(image, 1.0, m, 0, b, dst);
	imshow("亮度与对比度调整",dst);
}
static void on_contrast(int b, void * userdata) {
	Mat image = *((Mat*)userdata);
	Mat dst = Mat::zeros(image.size(), image.type());
	Mat m = Mat::zeros(image.size(), image.type());
	double contrast = b / 100.0;
	addWeighted(image, contrast, m, 0, 0, dst);
	imshow("亮度与对比度调整", dst);
}

void QuickDemo::tracking_bar_demo(Mat &image) {
	namedWindow("亮度与对比度调整",WINDOW_AUTOSIZE);

	src = image;
	int max_value = 100;
	int lightness = 50;
	int contrast_value = 100;
	createTrackbar("Value Bar","亮度与对比度调整",&lightness,max_value,on_lightness,(void*)(&image));
	createTrackbar("Contrast Bar", "亮度与对比度调整", &contrast_value, 200, on_contrast, (void*)(&image));
	on_lightness(50,&image);
}
void QuickDemo::keyboard_demo(Mat &image) {
	Mat dst = Mat::zeros(image.size(),image.type());
	while (true) {
		char c = waitKey(100);
		if (c == 27) { //按 ESC 键,即退出
			break;
		}
		if (c == 49) { //数字1
			std::cout <<"You input the  number "<< c << std::endl;
			cvtColor(image,dst,COLOR_BGR2GRAY);
		}
		if (c == 50) {//数字2
			std::cout << "You input the number " << c << std::endl;
			cvtColor(image,dst,COLOR_BGR2HSV);
		}
		if (c == 51) {//数字3
			std::cout << "You input the number " << c << std::endl;
			dst = Scalar(50,50,50);
			add(image, dst, dst);
		}
		imshow("键盘响应",dst);

	}

}

void QuickDemo::color_style_demo(Mat &image){
	int colormap[] = {
		COLORMAP_AUTUMN,
		COLORMAP_BONE,
		COLORMAP_JET,
		COLORMAP_WINTER,
		COLORMAP_RAINBOW,
		COLORMAP_OCEAN,
		COLORMAP_SUMMER,
		COLORMAP_SPRING,
		COLORMAP_COOL,
		COLORMAP_HSV,
		COLORMAP_PINK,
		COLORMAP_HOT,
		COLORMAP_PARULA};
	Mat dst;
	int index = 0;
	while (true) {
		char c = waitKey(500);
		if (c == 27) { //按 ESC 键,即退出
			break;
		}
		applyColorMap(image,dst,colormap[index%13]);
		index++;
		imshow("颜色风格", dst);
	}
}

void QuickDemo::bitwise_demo(Mat &image) {
	Mat m1 = Mat::zeros(Size(256,256),CV_8UC3);
	Mat m2 = Mat::zeros(Size(256, 256), CV_8UC3);
	rectangle(m1, Rect(100, 100, 80, 80),Scalar(255, 255, 0), -1, LINE_8, 0); //-1表示填充
	rectangle(m2, Rect(150, 150, 80, 80),Scalar(0,255, 255), -1, LINE_8, 0);
	imshow("m1",m1);
	imshow("m2", m2);
	Mat dst;
	bitwise_and(m1, m2, dst); 
	//bitwise_or(m1, m2, dst);
	//bitwise_not(m1,dst);
	//等价于 dst = ~m1;
	//bitwise_xor(m1,dst);
	imshow("像素位操作",dst);

}

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[0] = 0;
	//mv[1] = 0;
	//mv[2] = 0;
	merge(mv, dst);
	imshow("?",dst);

	int from_to[] = { 0,2,1,1,2,0 };
	mixChannels(&image,1,&dst,1,from_to,3); //1 表示源图和目标图数量3个通道
	imshow("通道混合",dst);
}

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);
	imshow("mask",mask);
	Mat redback = Mat::zeros(image.size(),image.type());
	redback = Scalar(40,40,200);
	imshow("redback", redback);
	bitwise_not(mask,mask);
	imshow("masknot", mask);
	image.copyTo(redback,mask);
	imshow("roi区域提取",redback);
}

void QuickDemo::pixel_statistic_demo(Mat &image) {
	double minv, maxv;
	Point minLoc, maxLoc;
	std::vector<Mat>mv;
	split(image, mv);

	for (int i = 0; i < mv.size(); i++) {
		minMaxLoc(mv[i], &minv, &maxv, &minLoc, &maxLoc, Mat()); //此函数要求目标图像为单通道
		std::cout << "\n\nnum of channels:" << i << "\nmin value:" << minv << "\nmax value" << maxv;

	}

	Mat mean, stddev;
	meanStdDev(image,mean,stddev);
	std::cout << "\n\nmeans:\n" << mean << "\n\nstddev:\n" << stddev;

	for (int i = 0; i < 3; i++) {
		std::cout<<"\nmean of channel "<< i << " : "<<mean.at<double>(i, 0)<<std::endl;
		std::cout << "\nstddev of channel " << i << " : " << stddev.at<double>(i, 0) << std::endl;


	}

}

void QuickDemo::drawing_demo(Mat &image) {
	Rect rect;
	rect.x = 100;
	rect.y = 100;
	rect.width = 250;
	rect.height = 300;
	Mat bg = Mat::zeros(image.size(), image.type());
	rectangle(bg, rect, Scalar(255, 0, 0), -1, 8,0);//绘制长方形
	circle(bg, Point(350, 400), 15, Scalar(255, 0, 0), -1, 8, 0);//绘制圆
	line(bg, Point(100, 100), Point(350, 400), Scalar(0, 255, 0), 2, 8, 0); //绘制线

	RotatedRect rrt;
	rrt.center = Point(200,200);
	rrt.size = Size(100,200);
	rrt.angle = 0.0;
	ellipse(bg,rrt,Scalar(0,255,255),2,8);//椭圆
	Mat dst;
	addWeighted(image, 1, bg, 0.5, 0, dst);
	imshow("绘制演示", dst);
}

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, w);
		int y1 = rng.uniform(0, h);
		int x2 = rng.uniform(0, w);
		int y2 = rng.uniform(0, h);
		line(canvas, Point(x1, y1), Point(x2, y2), Scalar(rng.uniform(0,255), rng.uniform(0, 255), rng.uniform(0, 255)), 1, LINE_AA,0);
		imshow("绘制演示", canvas);
	}

}

void QuickDemo::polyline_drawing_demo() {
	Mat canvas = Mat::zeros(Size(512,512),CV_8UC3);
	Point p1(100,100);
	Point p2(350, 100);
	Point p3(450, 280);
	Point p4(320, 450);
	Point p5(80, 400);
	std::vector<Point> pts;
	pts.push_back(p1);
	pts.push_back(p2);
	pts.push_back(p3);
	pts.push_back(p4);
	pts.push_back(p5);
	// pts 点集合
	//fillPoly(canvas,pts,Scalar(255,255,0),8,0); //可用此函数 进行多边形的填充
	//polylines(canvas, pts, true, Scalar(0, 0, 255), 2, 8, 0);//此函数不能够填充
	std::vector<std::vector<Point>> contours; //存储点集的集合,存放多个多边形
	contours.push_back(pts);
	drawContours(canvas, contours,-1,Scalar(255,0,0),-1); //对多个多边形同时绘制
	imshow("多边形绘制",canvas);
}


Point sp(-1, -1);
Point ep(-1,-1);
Mat temp;
static void on_draw(int event, int x, int y, int flags, void *userdata) {
	Mat image = *((Mat*)userdata);
	if (event == EVENT_LBUTTONDOWN) {
		sp.x = x;
		sp.y = y;
		std::cout << "start point:" << sp << std::endl;
	}
	else if (event == EVENT_LBUTTONUP) {
		ep.x = x;
		ep.y = y;
		int dx = ep.x - sp.x;
		int dy = ep.y - sp.y;
		if (dx > 0 && dy > 0) {
			Rect box(sp.x, sp.y, dx, dy);
			//temp.copyTo(image); 使得显示的ROI无红色框
			imshow("ROI区域", image(box));
			rectangle(image, box, Scalar(0, 0,255), 2, 8, 0);//绘制长方形
			imshow("鼠标绘制", image);

			sp.x = -1;
			sp.y = -1;
		}
	}
	else if (event == EVENT_MOUSEMOVE) {
		if (sp.x > 0 && sp.y > 0){
		ep.x = x;
		ep.y = y;
		int dx = ep.x - sp.x;
		int dy = ep.y - sp.y;
		if (dx > 0 && dy > 0) {
			Rect box(sp.x, sp.y, dx, dy);
			temp.copyTo(image);
			rectangle(image, box, Scalar(0, 0, 255), 2, 8, 0);//绘制长方形
			imshow("鼠标绘制", image);
		}
	}
}
}
void QuickDemo::mouse_drawing_demo(Mat &image) {
	namedWindow("鼠标绘制",WINDOW_AUTOSIZE);
	setMouseCallback("鼠标绘制",on_draw,(void*)(&image));
	temp = image.clone();
	imshow("鼠标绘制", image);

}

void QuickDemo::norm_demo(Mat &image) {
	Mat dst;
	std::cout << image.type();
	image.convertTo(image,CV_32F);  // CV_8UC3  ==>  CV_32FC3
	std::cout << image.type();
	//imshow("图像fd", image);  //opencv不能显示大于1的浮点
	normalize(image,dst,1.0,0,NORM_MINMAX);
	std::cout << dst.type() << std::endl;
	imshow("图像norm", dst);
}

void QuickDemo::resize_demo(Mat &image) {
	Mat zoomin, zoomout;
	int h = image.rows;
	int w = image.cols;
	resize(image,zoomin,Size(w/2,h/2),0,0,INTER_LINEAR);
	imshow("zoomin",zoomin);
	resize(image, zoomout, Size(w *1.5, h *1.5), 0, 0, INTER_LANCZOS4);
	imshow("zoomout", zoomout);
}

void QuickDemo::flip_demo(Mat &image) {
	Mat dst;
	flip(image,dst,-1); //  0 上下反转 ; 1 左右翻转 ; -1 上下左右翻转
	flip(dst, dst, 1);
	flip(dst, dst,0 );
	imshow("翻转",dst);
}

void QuickDemo::rotate_demo(Mat &image) {
	Mat dst, M;
	int w = image.cols;
	int h = image.rows;
	M = getRotationMatrix2D(Point2f(w / 2, h / 2), 45, 1.0); //45度旋转,放缩1.0
	//warpAffine(image, dst, M, image.size());
	//warpAffine(image, dst, M, image.size(),INTER_LANCZOS4,0,Scalar(255,0,0));

	double cos = abs(M.at<double>(0, 0));
	double sin = abs(M.at<double>(0, 1));
	double nw = cos*w + sin*h;
	double nh = sin*w + cos*h;

	M.at<double>(0, 2) = M.at<double>(0, 2) + (nw / 2 - w / 2);
	M.at<double>(1, 2) = M.at<double>(1, 2) + (nh / 2 - w / 2);
	warpAffine(image, dst, M, Size(nw,nh), INTER_LANCZOS4, 0, Scalar(255, 0, 0));
	imshow("旋转",dst);
}

void QuickDemo::video_demo(Mat &image) {
	//VideoCapture capture(0); //读取摄像头
	VideoCapture capture("out.avi");//读取视频流
	double frame_width = capture.get(CAP_PROP_FRAME_WIDTH); //获取视频宽高
	double frame_height = capture.get(CAP_PROP_FRAME_HEIGHT);
	double count = capture.get(CAP_PROP_FRAME_COUNT); // 视频 的  帧数
	double fps = capture.get(CAP_PROP_FPS); //fps
	std::cout << "宽 " << frame_width << "高"  << frame_height << "帧数" << count << " FPS" << fps;

	VideoWriter writer("testt.mp4", capture.get(CAP_PROP_FOURCC), fps, Size(frame_width, frame_height), true); // 保存视频第一步,编码格式不知道的话和原来保持一致(用CAP_PROP_FOURCC) ,Size为保存大小,true为颜色保持一致

	Mat frame;
	while (true) {
		//flip(frame,frame,1); //镜像翻转 ,可以调用上面的方法进行处理,换背景,颜色空间转换等
		capture.read(frame);
		if (frame.empty()) {
			break;
		}
		imshow("frame",frame);
		colorSpace_Demo(frame);

		writer.write(frame); // 保存视频第二步

		int c = waitKey(10);
		if (c == 27) { //按 ESC 键,即退出
			break;
		}
	}
	capture.release();
	writer.release();// 保存视频第三步
}

void QuickDemo::showHistogram(Mat &image) {
	//三通道分离
	std::vector<Mat>bgr_plane;
	split(image,bgr_plane);
	//定义参数变量
	const int channels[1] = { 0 };
	const int bins[1] = { 256 };
	float hranges[2] = {0,255};
	const float* ranges[1] = { hranges };

	Mat b_hist;
	Mat g_hist;
	Mat r_hist;

	//计算B G R 通道的直方图
	calcHist(&bgr_plane[0], 1, 0, Mat(), b_hist, 1, bins, ranges);
	calcHist(&bgr_plane[1], 1, 0, Mat(), b_hist, 1, bins, ranges);
	calcHist(&bgr_plane[2], 1, 0, Mat(), b_hist, 1, bins, ranges);

	//显示直方图
	int hist_w = 512;
	int hist_h = 400;
	int bin_w = cvRound((double)hist_w / bins[0]);
	Mat histImage = Mat::zeros(hist_h,hist_w,CV_8UC3);
	//归一化直方图数据
	normalize(b_hist, b_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat());
	normalize(g_hist, g_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat());
	normalize(r_hist, r_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat());

	//绘制直方图曲线
	for (int i = 1; i < bins[0]; i++) {
		line(histImage, Point(bin_w*(i - 1), hist_h - cvRound(b_hist.at<int>(i - 1))),
			Point(bin_w*(i), hist_h - cvRound(b_hist.at<int>(i))), Scalar(255, 0, 0), 2, 8, 0);

		line(histImage, Point(bin_w*(i - 1), hist_h - cvRound(g_hist.at<int>(i - 1))),
			Point(bin_w*(i), hist_h - cvRound(g_hist.at<int>(i))), Scalar(0, 0, 0), 2, 8, 0);

		line(histImage, Point(bin_w*(i - 1), hist_h - cvRound(r_hist.at<int>(i - 1))),
			Point(bin_w*(i), hist_h - cvRound(r_hist.at<int>(i))), Scalar(0, 0,255), 2, 8, 0);
	}

	namedWindow("HISTOGRAM DEMO",WINDOW_AUTOSIZE);
	imshow("HISTOGRAM DEMO",histImage);
}

void QuickDemo::histogram_2d_demo(Mat &image) {
	//2d 直方图
	Mat hsv, hs_hist;
	cvtColor(image,hsv,COLOR_BGR2HSV);
	int hbins = 30, sbins = 32;
	int hist_bins[] = { hbins,sbins };
	float h_range[] = { 0,180 };
	float s_range[] = { 0,256 };
	const float* hs_ranges[] = { h_range,s_range };
	int hs_channels[] = { 0,1 };
	calcHist(&hsv, 1, hs_channels, Mat(), hs_hist, 2, hist_bins, hs_ranges, true, false);
	double maxVal = 0;
	minMaxLoc(hs_hist,0,&maxVal,0,0);
	int scale = 10;
	Mat hist2d_image = Mat::zeros(sbins * scale, hbins *scale, CV_8UC3);
	for (int h = 0; h < hbins; h++) {
		for (int s = 0; s < sbins; s++) {
			float binVal = hs_hist.at<float>(h, s);
			int intensity = cvRound(binVal*255/maxVal);
			rectangle(hist2d_image, Point(h * scale, s * scale),
				Point((h + 1)*scale - 1, (s + 1)*scale - 1),
				Scalar::all(intensity), -1);

		}
	}
	applyColorMap(hist2d_image,hist2d_image,COLORMAP_PINK);
	imshow("H-S histogram" , hist2d_image);
	imwrite("hist_2d.png",hist2d_image);
}

void QuickDemo::histogram_eq_demo(Mat &image) {
	Mat gray;
	cvtColor(image,gray,COLOR_BGR2GRAY);
	imshow("灰度图",gray);
	Mat dst;
	equalizeHist(gray,dst);
	imshow("均衡化",dst);

}

void QuickDemo::blur_demo(Mat &image) {
	Mat dst;
	blur(image, dst, Size(13, 13), Point(-1,-1));
	imshow("图形模糊", dst);
	
}
void QuickDemo::gaussian_blur_demo(Mat &image) {
	Mat dst;
	GaussianBlur(image, dst, Size(13, 13), 15);
	imshow("图形模糊", dst);

}

void QuickDemo::bifilter_demo(Mat &image) {
	Mat dst;
	bilateralFilter(image, dst,0,100,10);
	imshow("图形模糊", dst);

}

void QuickDemo::face_detect() {
	std::string root_dir = "F:/opencv/sources/samples/dnn/face_detector/"; #修改为你的地址
	dnn::Net net = dnn::readNetFromTensorflow(root_dir+"opencv_face_detector_uint8.pb",root_dir+"opencv_face_detector.pbtxt");
	VideoCapture capture(0);
	Mat frame;
	while (true) {
		capture.read(frame);
		if (frame.empty()) {
			break;
		}
		Mat blob = dnn::blobFromImage(frame, 1.0, Size(300, 300), Scalar(104, 177, 123), false, false); //Size此模型要求300*300
		net.setInput(blob);//blob格式:NCHW
		Mat probs = net.forward(); //输出:图像张的编号,图像的批次,框数,框的7个值
		Mat detectionMat(probs.size[2],probs.size[3],CV_32F,probs.ptr<float>());
		//解析结果
		//detectionmat 中 分别表示类型 index  得分 
		for (int i = 0; i < detectionMat.rows; i++) {
			float confidence = detectionMat.at<float>(i, 2);
			if (confidence > 0.5) {
				int x1 = static_cast<int>(detectionMat.at<float>(i, 3)*frame.cols);
				int y1 = static_cast<int>(detectionMat.at<float>(i, 4)*frame.rows);
				int x2 = static_cast<int>(detectionMat.at<float>(i, 5)*frame.cols);
				int y2 = static_cast<int>(detectionMat.at<float>(i, 6)*frame.rows);
				Rect box(x1, y1, x2 - x1, y2 - y1);
				rectangle(frame,box,Scalar(0,0,255),2,8,0);


			}
		}
		imshow("人脸检测演示", frame);
		int c = waitKey(1);
		if (c == 27) { //按 ESC 键,即退出
			break;
		}
	}

}

quickopencv.h

#pragma once
#include <opencv2/opencv.hpp>

using namespace cv;

class QuickDemo {
public:
	void colorSpace_Demo(Mat &image);//颜色空间转换
	void mat_Creation_demo(Mat &image);//创建空白图像
	void pixel_visit_demo(Mat &image);//像素查看
	void operators_demo(Mat &image);//图片加减数值
	void testsubt(Mat &image0,Mat &image1);//测试有无雾图片加减
	void tracking_bar_demo(Mat &image);//拖动条响应
	void keyboard_demo(Mat &image);//键盘响应
	void color_style_demo(Mat &image);//颜色类型操作
	void bitwise_demo(Mat &image); //位操作
	void channels_demo(Mat &image);//通道合并与拆分
	void inrange_demo(Mat &image);//图像色彩空间转换,抠图,换背景等
	void pixel_statistic_demo(Mat &image);//图像像素值统计 均值 方差
	void drawing_demo(Mat &image); //绘制长方形 圆形 椭圆
	void random_drawing(); // 绘制随机数 与 随机颜色
	void polyline_drawing_demo();//绘制多边形
	void mouse_drawing_demo(Mat &image);// 鼠标响应绘制多边形
	void norm_demo(Mat &image); //图像归一化
	void resize_demo(Mat &image);//放缩
	void flip_demo(Mat &image); // 镜像 翻转图像
	void rotate_demo(Mat &image);//旋转
	void video_demo(Mat &image); //视频
	void showHistogram(Mat &image);//直方图
	void histogram_2d_demo(Mat &image);//2d 直方图
	void histogram_eq_demo(Mat &image);//直方图均衡化
	void blur_demo(Mat &image); //均值模糊 卷积
	void gaussian_blur_demo(Mat &image); //高斯模糊
	void bifilter_demo(Mat &image); // 双边模糊,保留边缘 去掉噪声
	void face_detect(); //人脸检测
};

test440.cpp

注:图片可自行更改


#include<opencv2/opencv.hpp>
#include<iostream>
#include <quickopencv.h>

using namespace cv;
using namespace std;

int main(int argc, char **argv) {
	Mat src = imread("D:\\opencvproject\\Project32015\\Project32015\\test.jpg");
	Mat src0 = imread("D:\\opencvproject\\Project32015\\Project32015\\hsos0.png");
	Mat src1 = imread("D:\\opencvproject\\Project32015\\Project32015\\hsos1.png");
	Mat src2 = imread("D:\\opencvproject\\Project32015\\Project32015\\green.png");

	if (src.empty()) {
		printf("could not load image\n");
		waitKey(0);
		return -1;
	}
	//namedWindow("输入窗口",WINDOW_FREERATIO);
	//imshow("输入窗口", src2);
	QuickDemo qd;

	//qd.colorSpace_Demo(src);//颜色空间转换
	//qd.mat_Creation_demo(src);//创建空白图像
	//qd.pixel_visit_demo(src);//像素查看
	//qd.operators_demo(src);//图片加减数值
	//qd.testsubt(src0, src1);//测试有无雾图片加减
	//qd.tracking_bar_demo(src);//拖动条响应
	//qd.keyboard_demo(src);//键盘响应
	//qd.color_style_demo(src);//颜色类型操作
	//qd.bitwise_demo(src); //位操作
	//qd.channels_demo(src);//通道合并与拆分
	//qd.inrange_demo(src2);//图像色彩空间转换,抠图,换背景等
	//qd.pixel_statistic_demo(src); //图像像素值统计 均值 方差
	//qd.drawing_demo(src); // 绘制随机数 与 随机颜色
	//qd.random_drawing(); // 绘制随机数 与 随机颜色
	//qd.polyline_drawing_demo(); // 用ploylines绘制多边形 并用 函数fillpoly填充
	//qd.mouse_drawing_demo(src);// 鼠标响应绘制多边形
	//qd.norm_demo(src2);//归一化
	//qd.resize_demo(src);//放缩resize
	//qd.flip_demo(src);//镜像
	//qd.rotate_demo(src);//旋转
	//qd.showHistogram(src2); //直方图
	//qd.histogram_2d_demo(src);//2d直方图
	//qd.histogram_eq_demo(src); //直方图均衡
	//qd.blur_demo(src); //均值卷积 模糊
	//qd.gaussian_blur_demo(src); //高斯模糊
	//qd.bifilter_demo(src); //双边模糊 保留边缘,去掉噪声
	qd.face_detect(); //人脸检测
	waitKey(0);
	destroyAllWindows();
	return 0;
}

树莓派4B基于OpenCV的C++环境的串口通信 Python微信订餐小程序课程视频 https://blog.youkuaiyun.com/m0_56069948/article/details/122285951 Python实战量化交易理财系统 https://blog.youkuaiyun.com/m0_56069948/article/details/122285941 第二次积分赛我们队选择了飞控,我负责图像方面,我先简要说明一下该题中树莓派所需要的功能:用OpenCV图像处理进行巡线,同时识别红圆和绿圆。然后就是关键的一步,树莓派与飞控的通信。 树莓派将处理好的 阅读详情

相关推荐

学习opencv中文版 PDF

学习opencv中文版,是一本经典的opencv入门作品,比较全面的介绍了opencv这一计算机视觉开放库的基本内容以及应用。

一文搞定OpenCV快速入门(附网盘链接)

前言 本系列包含两篇博客,主要分享OpenCV常用的操作,文末会分享相关著作电子版链接。 传送门 基础操作 进阶操作 资源 链接:https://pan.baidu.com/s/1FlioORwwixsopfESgnsJpA 提取码:aogg

小陈说CV的博客 8788

OpenCV快速入门

1.了解计算机视觉基础知识和应用 2.学会OpenCV基本操作 3.学习图像处理方法 4.学习人脸检测,人脸识别应用

OpenCV4 快速入门 (学习笔记 全)

《OpenCV4 快速入门》学习笔记

weixin_42264818的博客 6792

OpenCV入门教程pdf文字版

OpenCV OpenCV OpenCVOpenCV是一个广受欢迎的开源计算机视觉库 是一个广受欢迎的开源计算机视觉库 ,它提供了 很多函数,实现很多计算机视觉法,从最基本的 滤波到高级物体检测 皆有涵盖 。很多 初学者希望快速掌握 OpenCV OpenCV OpenCVOpenCV的使用方法 ,但 往会 遇到 各种样的困难。 其 实仔细分析,造成这些困难的原因 有两类:第一是 C/C++/C++/C++/C++编程基础不过关; 第二类是不了解算法原理。 解决 这些 困难无非提升编程能力,以及理论基 础知识。 提升编程能力需要多练习,理论知识系统学《数字图 像处理》、《计算机视觉和模式识别等课程,所有这些都不 像处理》、《计算机视觉和模式识别等课程,所有这些都不 像处理》、《计算机视觉和模式识别等课程,所有这些都不 能一蹴而就 , 需

OpenCV实用入门教程-pdf

OpenCV OpenCV OpenCVOpenCV是一个广受欢迎的开源计算机视觉库 是一个广受欢迎的开源计算机视觉库 ,它提供了 很多函数,实现很多计算机视觉法,从最基本的 滤波到高级物体检测 皆有涵盖 。很多 初学者希望快速掌握 OpenCV OpenCV OpenCVOpenCV的使用方法 ,但往会遇到各……

openCV4.0 C++ 快速入门30讲学习笔记(自用 代码+注释)详细版

课程来源:哔哩哔哩 环境:OpenCV4.5.1 + VS2019 目录 002.图像色彩空间转换 003.图像对象的创建与赋值 004.图像像素的读写操作 005.图像像素的算术操作(加减乘除4种不同的API实现 006.滚动条-调整图像亮度 007.滚动条-传递参数 008.键盘响应操作 009.OpenCV自带颜色表操作 010.图像像素的逻辑操作(与,或,非,异或 011.通道合并与分离 012.图像色彩空间转换(提取轮廓然后换绿幕 013.图像像素值统计(min,max

weixin_47059239的博客 8636

openCV快速入门.pdf

摘要:本文旨在帮助读者快速入门OpenCV,而无需阅读冗长的参考手册。掌握了OpenCV的以下基础知识后,有需要的话再查阅相关的参考手册。

opencv_C++学习笔记(入门30讲)

本博客作为OpenCV与C++入门视频学习笔记,记录一些图像和视频的简单操作,并对相应的函数做了分析。

qq_43916860的博客 1万+

opencv 4.5.4 百度网盘链接(因为大小有1G多,故给网盘链接)

opencv 4.5.4 亲测可用 详见博客

opencv 快速入门教程

openCV入门教程,讲得很清晰易懂;有兴趣的朋友可以下载看看。。。。

【个人笔记】OpenCV4 C++ 快速入门 30课

30 案例:实施人脸检测

优快云仅为笔记之用。 6123

OpenCv入门学习笔记.pdf

opencv入门学习文档,是根据个人学习记录的笔记总计三百多页,内含书签,文档简洁适合快速入门,了解图像处理,视频跟踪,神经网络等概念和基本原理,以及人脸识别案例在Opencv中的实现,内含了C++实现源代码。

OpenCV4 C++ 快速入门视频30讲 - 系列合集

OpenCV4 C++ 快速入门视频30讲 - 系列合集

oldmoney 589

【头歌实训:逆置顺序表】

根据提示,在右侧编辑器补充函数rev的代码,使用顺序表L的空间就地逆置L。},要求时间复杂度为O(n),空间复杂度为O(1)。第一行为顺序表逆置之前的元素。每个数据后一个空格。第二行为顺序表逆置之后的元素。每个数据后一个空格。本关任务:设计一个算法,将一个顺序表L的元素{a。第一行为顺序表中元素个数n。第二行为空格隔开的n个整数。开始你的任务吧,祝你成功!

guang_Lee的博客 997

避开这些坑!DS18B20温度读取不准、时序混乱的5个常见问题与调试方法

本文深入解析DS18B20温度传感器在应用中常见的5个问题,包括温度读取不准、时序混乱等,并提供详细的调试方法。通过硬件设计优化、精准延时实现和数据解析技巧,帮助开发者有效解决温度值跳变、初始化失败等典型问题,提升OneWire协议下的温度测量精度。

weixin_29185493的博客 463

Opencv快速入门(C++版),新手向

Opencv快速入门(C++版)前言1、图像的读取与显示所使用的API接口:代码演示:2、图像色彩空间转换所使用的API接口:代码演示:3、图像对象的创建与赋值所使用的API接口:代码演示:4、像素的读写操作所使用的API接口:代码演示:5、像素的算术操作所使用的API接口:代码演示:6、滚动条调整图像亮度与对比度所使用的API接口:代码演示:7、键盘响应所使用的API接口:代码演示:8、Opencv自带颜色表操作(滤镜)所使用的API接口:代码演示:9、像素逻辑操作所使用的API接口:代码演示:10、通道

Galen_xia的博客 2万+

深度学习(Deep Learning, DL)简介

深度学习(Deep Learning, DL)是机器学习的一个子领域,主要使用多层神经网络来处理复杂的数据和任务。深度学习通过模拟人脑的神经网络结构,能够自动提取特征并进行高效的模式识别和预测。

qq_28791753的博客 1万+

C++音视频开发从放弃到入门 (基于FFmpeg+OpenCV)

FFmpeg及OpenCV是开源、跨平台的音视频开发SDK,从事音视频开发基本都需要用到它。因为C及C++都是跨平台的开发语言,因此,基于C和C++开发的FFmpeg+OpenCV应用代码只需做少量修改就可以从一个平台移植到另一个平台而无需担心性能有所下降,如从PC移植到Android就是如此。下面的应用都是基于这个思想开发的,开发的原则就是用最少的代码实现最核心的功能,方便使用者二次开发,方便跨平台移植。

西部秋虫的博客 1万+

物联网组网技术优缺点对比:蓝牙、LoRa、wifi、NB-IoT、ZigBee等

1.前言 最近对物联网产品自组网技术选型,找到合适的组网技术,让产品自行组网并完成数据的传输。 2.参数对比

谁念西风独自凉 4万+

STM32接入CH340芯片的升级电路及初始化进入升级模式(死机)问题处理

MCU-REST 在 MCU-BOOT0 处于低电平状态下,进行下拉操作,在MCU-REST 与 MCU-BOOT0 恢复正常电平时,将导致MCU死机,MCU-REST 先于 MCU-BOOT0 下拉可解决该问题;MCU-REST 在 上升沿结束时将判断 MCU-BOOT0 的状态,MCU-BOOT0 处于高电平,MCU死机,MCU-BOOT0 处于低电平 MCU 正常;

LuDvei的博客 2490

C++基于opencv4的视频质量检测

基于opencv4实现的视频质量诊断, 视频质量诊断----亮度异常检测 视频质量诊断----色度异常检测 视频质量诊断----雪花噪声检测 视频质量诊断----条纹噪声检测 视频质量诊断----模糊检测 视频质量诊断----信号丢失检测 视频质量诊断----遮挡检测 视频质量诊断----画面冻结检测 视频质量诊断----PTZ云台运动检测 视频质量诊断----画面抖动检测...

Where there is life, there is hope. 7754

基于Freertos与lwip移植FreeModbusTcp协议

基于FreeRTOS的N32G457VEL7之LWIP网络协议栈移植-优快云博客。

Dd_456456的博客 3238

OpenCV4,快速入门,目录篇

本系列博客为OpenCV4初学开发者提供系统化实战教程,通过30讲内容从基础到进阶全面掌握图像与视频处理核心技能。

汽车电子软件领域知识分享 720

极路由 极1s J1S hc5661 刷padavan固件

极路由1S刷机指南 准备工作: 下载Breed不死固件 通过WinSCP上传或直接wget获取 执行mtd命令写入Breed 关键步骤: 进入Breed控制台(按住Reset键开机) 备份原厂固件和密钥 下载Padavan固件(RT-N14U-GPIO-12-xiaodu-ji1S-128M.trx) 刷机过程: 在Breed控制台更新固件 等待自动重启完成 初始设置: 管理地址:192.168.123.1 默认账号:admin/admin 无线名称:PCDN 无线密码:1234567890 注意事项:切勿

SimonLiu的博客 1302

1.1 了解Spring框架 -《SSM深入解析与项目实战》

文章目录第1篇 基础概念第1章 谈谈SSM框架和Redis1.1 了解Spring框架1.1.1 如何学习Spring1.1.2 IoC(Inversion of Control 控制反转)1.1.3 AOP(Aspect Oriented Programing面向切面编程) 项目中所有的源码都可以在此链接的仓库中找到:https://github.com/chenhaoxiang/uifuture-ssm 本章非常形象的介绍了Springn中最核心的两个概念,IoC和AOP,使用了现实中的例子

谙忆-陈浩翔 2133
上一篇:  决策树可视化Program terminated with status: 1. stderr follows: Format: “png“ not recognized. Use one of:
下一篇: C++ 函数重载
Alocus_
Alocus_ 新星创作者: 人工智能技术领域 新星创作者: 人工智能技术领域
博客等级 码龄9年 2万+粉丝 184原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alocus_

如果我的内容帮助到你,打赏我吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值