代码 | C++ Opencv 手写代码复习 Mat/读写/滑动条/二值/绘图/形态学/轮廓/仿射变换

2023赛季培训需要 ,写了份代码,也顺便给自己复习,因为一开始学Opencv是python版(组长对我太宽容了hhhh)

第一次培训代码:详解二值化与图像计算概念 (遍历像素点,三通道二值化)

#include<opencv2/opencv.hpp>
#include<iostream>
#include<vector> 
// @author uuyymilkyl
using namespace std;
using namespace cv;

int main() {
	cv::VideoCapture cap("4.mp4"); //文件路径记得要换
	cv::Mat src, dst, gray;
	std::vector<cv::Mat>BGRsplit;

	while (1) {
		cap >> src;
		cv::split(src, BGRsplit);
		for (size_t i = 0; i < src.rows; i++) { //rows  矩阵的行数
			for (size_t j = 0; j < src.cols; j++) { //cols   矩阵的列数
				if (BGRsplit[0].at<uchar>(i, j) <= 250 && BGRsplit[1].at<uchar>(i, j) <= 210 &&
					BGRsplit[2].at<uchar>(i, j) < 250) {
					BGRsplit[0].at<uchar>(i, j) = 0;
					BGRsplit[1].at<uchar>(i, j) = 0;
					BGRsplit[2].at<uchar>(i, j) = 0;
				}  // 0 是黑色 255是白色 
				else {
					BGRsplit[0].at<uchar>(i, j) = 255;
					BGRsplit[1].at<uchar>(i, j) = 255;
					BGRsplit[2].at<uchar>(i, j) = 255;
				}
			}
		//cv::cvtColor(src, gray, cv::COLOR_BGR2GRAY);
		//cv::threshold(gray, dst, 150, 255, THRESH_BINARY); //上面一段注释换成这里解注释即变成灰度图(单通道)法

		}
		merge(BGRsplit, dst);

		cv::imshow("SRC", src);
		cv::imshow("result", dst);
		cv::waitKey(1);
	}
	return 0;
}

第二次培训: 代码演示详解Mat/读写/滑动条/二值/绘图/形态学/轮廓/仿射变换

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

using namespace cv;
using namespace std;

//@author uuyymilkyl
int ReadPicture(Mat &InputImage) {
	cv::Mat src = InputImage;
	cv::namedWindow("input", WINDOW_FREERATIO);
	cv::imshow("input", src);
	cv::waitKey(600);
	cv::destroyAllWindows;
	return 0;
}
Mat MatOperation() {
	cv::Mat m1 = Mat::zeros(400, 500, CV_8UC3);//相当于创建一张黑色的图,每个像素的每个通道都为0,Scalar(0,0,0);
	cv::Mat m2(400, 400, CV_8UC3, Scalar(0,0,127)); // 创建一张红色的图,格式在 CV_8UC3 表示8位深3通道图,用scalar去指定每个像素的颜色值)
	
	cv::imshow("input", m2);
	cv::waitKey(600);
	cv::destroyAllWindows;
	return m1;
}
//--------------------Mat 基础---------------

Mat src = cv::imread("F:/33.jpg");
Mat src1;
Mat dst;
int value = 50;

//-------------二值化+滑动条-----------------
void src_threshold(int ,void*) {
	cvtColor(src, src1, cv::COLOR_BGR2GRAY);
	threshold(src1, dst, value, 255, cv::THRESH_BINARY);
	imshow("二值化", dst);
}

int CreateTrackBar(){
	namedWindow("二值化", WINDOW_AUTOSIZE);
	const int max = 255;
	
	createTrackbar("value:", "二值化", &value, max, src_threshold);//参数 轨迹的名称、窗口名称、初始位置 ,最大值,回调函数
	src_threshold(0,0);
	waitKey(0);
	return 0;
}

//--------------读取视频----------------
int ReadVideo() {
	VideoCapture cap("4.mp4");

	if (!cap.isOpened())
	{
		std::cerr << "Couldn't open capture." << std::endl;
		return -1;
	}

	Mat frame;
	while (1)
	{
		cap >> frame;
		if (frame.empty()) break;
		imshow("Video", frame);
		if (waitKey(33) >= 0) break;
	}

	return 0;
}
//---------------形态学基础----------------

int MakeDilate() {
	Mat kernel;
	kernel = getStructuringElement(MORPH_RECT, Size(15, 15));        //做一个kernel内核
	dilate(src, dst, kernel);                            //膨胀
	erode(src, dst, kernel);                               //侵蚀
	imshow("膨胀", dst);
	imshow("腐蚀", dst);
	waitKey(3900);
	return 0;
}

//---------------绘制图案-------------------


Mat DrawPattern(Mat &image){//指针调用图片
	Mat pattern;
	line(image, Point(210, 50), Point(250, 250), Scalar(255, 0, 0), 4, LINE_AA);
	// 原图 起点,终点,颜色,粗细 , 线条类型
	ellipse(image, Point(270, 230), Size(100, 50), 60, 0, 360, Scalar(255, 0, 0), 4, 8);
	// 原图 圆心坐标 轴长 (size类),偏转角 圆弧起始角,终点角 ,颜色 粗细,类型
	rectangle(image, Point(0, 0), Point(200, 200), Scalar(255, 0, 0), -1, 8);
	// 原图 左上顶点,左下顶点,颜色,线条粗细 -1表示填充,线条类型
	imshow("drawpattern", image);
	waitKey(900);
	pattern = image;
	return pattern;
}
// --------------------- 找轮廓 ------------------------------

int Find_Contours() {
	Mat src = cv::imread("F:/44.jpg"); 
	cv::Mat dst,src1;
	//src = image;
	cvtColor(src, src1, cv::COLOR_BGR2GRAY);
	threshold(src1, dst, 29, 255, cv::THRESH_BINARY_INV);
	cv::imshow("dst", dst);
	cv::waitKey(900);

	std::vector<std::vector<cv::Point>> contours;
	std::vector<cv::Vec4i> hierarchy;
	cv::findContours(src1, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);  //只找最外层轮廓

	for (int i = 0; i < contours.size(); ++i) {  //绘制所有轮廓
		cv::drawContours(src, contours, i, cv::Scalar(0, 170, 0), 4);  //thickness为-1时为填充整个轮廓
	}

	cv::imshow("now", src);
	cv::waitKey(900);

	return 0;
}


//----------透视变换---------
Mat Transform() {
	Mat matrix, src2,dst2;
	src2 = cv::imread("F:/44.jpg");
	float w = 249, h = 350; //给定生成图像的长宽

	Point2f pointsrc[4] = { {121,54},{584,67},{582,316},{115,317} };

	Point2f pointdst[4] = { {0.0f,0.0f},{w,0.0f},{0.0f,h},{w,h} };

	matrix = getPerspectiveTransform(pointsrc, pointdst);

	warpPerspective(src2, dst2, matrix, Point(w, h));

	imshow("New Image", dst2);

	waitKey(3000);
	return dst2;
}


//------------ 主函数,怎么构建函数完成不一样的操作,以及考核---------------
int main() {
	cv::Mat image = cv::imread("F:/33.jpg");
	//ReadPicture(image);
	//MatOperation();
	//CreateTrackBar();
	//MakeDilate();
	//ReadVideo();
	//DrawPattern(image);
	//Find_Contours();
	Transform();
}

算法组的孩子们加油 0 0 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值