2023赛季培训需要 ,写了份代码,也顺便给自己复习,因为一开始学Opencv是python版(组长对我太宽容了hhhh)
第一次培训代码:详解二值化与图像计算概念 (遍历像素点,三通道二值化)
#include
#include
#include
// @author uuyymilkyl
using namespace std;
using namespace cv;
int main() {
cv::VideoCapture cap("4.mp4"); //文件路径记得要换
cv::Mat src, dst, gray;
std::vectorBGRsplit;
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(i, j) <= 250 && BGRsplit[1].at(i, j) <= 210 &&
BGRsplit[2].at(i, j) < 250) {
BGRsplit[0].at(i, j) = 0;
BGRsplit[1].at(i, j) = 0;
BGRsplit[2].at(i, j) = 0;
} // 0 是黑色 255是白色
else {
BGRsplit[0].at(i, j) = 255;
BGRsplit[1].at(i, j) = 255;
BGRsplit[2].at(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
#include
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> contours;
std::vector 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