OpenCV 4.5.1
C++20
Ubuntu 20.04
素材
来源,基于 K近邻博文 中原5000个手写数字得到的按行排列的手写数字数据以及对应行的标签, 保存为图片后直接放到这里使用,避免重复数据处理
(右键图片另存为)
行数据.png
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210314000825970.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU3OTk5NA==,size_16,color_FFFFFF,t_70)
标签.png
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210314000849399.png)
6.png
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210314085624351.png)
组态档
# 设置用于构建该项目的最低cmake版本
cmake_minimum_required(VERSION 3.1)
# 设置项目名称和编程语言
project(opencv_demo CXX)
# 寻找opencv的头文件和库文件
find_package(OpenCV REQUIRED)
# opencv头文件路径
include_directories(${OpenCV_INCLUDE_DIRS})
# opencv库路径
link_directories(${OpenCV_LIBRARY_DIRS})
# 自定义头文件路径
include_directories(include)
# 设置二进制文件生成路径
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
# 获取源码的路径
aux_source_directory(src src)
# 设置编译标准和额外参数
add_compile_options(-std=c++20 -Wall -Werror -Wextra -pedantic -Wimplicit-fallthrough -Wsequence-point -Wswitch-default -Wswitch-unreachable -Wswitch-enum -Wstringop-truncation -Wbool-compare -Wtautological-compare -Wfloat-equal -Wshadow=global -Wpointer-arith -Wpointer-compare -Wcast-align -Wcast-qual -Wwrite-strings -Wdangling-else -Wlogical-op -Wconversion -Wno-pedantic-ms-format)
# 从源码构建二进制文件
add_executable(demo ${src})
# 链接opencv库到二进制文件
target_link_libraries(demo ${OpenCV_LIBRARIES})
源码
#include <iostream>
#include "opencv2/highgui.hpp"
#include "opencv2/core.hpp"
#include "opencv2/ml.hpp"
#include "opencv2/imgproc.hpp"
int main()
{
cv::Mat data = cv::imread("./resources/行数据.png", cv::IMREAD_ANYDEPTH);
cv::Mat labels = cv::imread("./resources/标签.png", cv::IMREAD_ANYDEPTH);
if (data.empty() || labels.empty())
{
std::cout << "请检查行数据和标签是否在要求的路径存在" << std::endl;
exit(EXIT_FAILURE);
}
data.convertTo(data, CV_32FC1);
labels.convertTo(labels, CV_32SC1);
cv::Ptr<cv::ml::RTrees> model = cv::ml::RTrees::create();
model->setTermCriteria(cv::TermCriteria(cv::TermCriteria::MAX_ITER + cv::TermCriteria::EPS, 100, 0.01));
cv::Ptr<cv::ml::TrainData> trainData = cv::ml::TrainData::create(data, cv::ml::ROW_SAMPLE, labels);
model->train(trainData);
std::cout << "完成训练" << std::endl;
cv::Mat test3 = cv::imread("./resources/6.png", cv::IMREAD_GRAYSCALE);
if (test3.empty())
{
std::cout << "请检查测试需要的数据是否在要求的路径存在" << std::endl;
exit(EXIT_FAILURE);
}
cv::imshow("1.png", test3);
cv::resize(test3, test3, cv::Size(20, 20));
cv::Mat testData = cv::Mat::zeros(1, 400, CV_8UC1);
cv::Rect rect;
rect.x = 0;
rect.y = 0;
rect.height = 1;
rect.width = 400;
cv::Mat nine = test3.reshape(1, 1);
nine.copyTo(testData(rect));
testData.convertTo(testData, CV_32F);
cv::Mat result;
model->predict(testData, result);
std::cout << "预测结果: " << result.at<float>(0, 0) << " 实际结果: 6" << std::endl;
cv::waitKey(0);
}
项目结构
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210314085847194.png)
蓝色为文件夹
测试
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210314085919617.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU3OTk5NA==,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210314085954838.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU3OTk5NA==,size_16,color_FFFFFF,t_70)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)