在本教程中,你将了解如何使用神经网络来提高图表检测算法的准确性。
生成本地
生成 OpenCV 时,运行以下命令以生成所有 contrib 模块
cmake -D OPENCV_EXTRA_MODULES_PATH=<opencv_contrib>/modules/
仅生成 mcc 模块或
cmake -D OPENCV_EXTRA_MODULES_PATH=<opencv_contrib>/modules/mcc
或确保在 CMake 的 GUI 版本中选中 mcc 模块:cmake-gui。
示例源代码
可以通过以下方式运行示例代码
<path_of_your_opencv_build_directory>/bin/example_mcc_chart_detection_with_network -t=<type_of_chart> -m=<path_to_neural_network> -pb=<path_to_models_pbtxt> -v=<optional_path_to_video_if_not_provided_webcam_will_be_used.mp4> --ci=<optional_camera_id_needed_only_if_video_not_provided> --nc=<optional_maximum_number_of_charts_in_image> --use_gpu <optional_should_gpu_be_used>
``'
* -t=# 为图表类型,其中 0(标准)、1(DigitalSG)、2(黑胶唱片)
* --ci=# 为摄像机 ID,其中 0(默认为主摄像机),1(副摄像机)等
* --nc=# 默认为 1,表示仅检测最佳图表
示例
在 CPU 上运行(不会使用 GPU)/home/opencv/build/bin/example_mcc_chart_detection_with_network -t=0 -m=/home/model.pb –pb=/home/model.pbtxt -v=mcc24.mp4
在 GPU 上运行 /home/opencv/build/bin/example_mcc_chart_detection_with_network -t=0 -m=/home/model.pb –pb=/home/model.pbtxt -v=mcc24.mp4 –use_gpu
在 GPU 上运行并检测最佳 5 个图表(检测可以少于 5 个,但不能多于 5 个)/home/opencv/build/bin/example_mcc_chart_detection_with_network -t=0 -m=/home/model.pb –pb=/home/model.pbtxt -v=mcc24.mp4 –use_gpu –nc=5 ```
12const char *about =
基本图表检测使用神经网络;
14 "{ help h usage ? | | 显示此消息 }"
15 "{t | 0 | chartType: 0-Standard, 1-DigitalSG, 2-Vinyl, 默认:0}"
16 "{m | | 模型的文件路径,如果你没有模型, 可以在文档中
18 "{pb | | pbtxt 文件的路径,可以使用模型
20 "{v | | 视频文件中的输入,如果省略,输入来自摄像头}"
21 "{ci | 0 | 如果输入不来自视频 (-v) 的摄像头 id }"
22 "{nc | 1 | 图像中图表的最大数量}"
23 "{use_gpu | | 如果你想使用 gpu, 可以添加此标志}";
25int main(
int argc,
char *argv[])
36 parser.printMessage();
40 int t = parser.get<
int>(
t);
43 TYPECHART chartType = TYPECHART(t);
45 string model_path = parser.get<
string>(
m);
46 string pbtxt_path = parser.get<
string>(
"pb");
48 int camId = parser.get<
int>(
"ci");
49 int nc = parser.get<
int>(
"nc");
54 video = parser.get<
String>(
"v");
56 bool use_gpu = parser.has(
"use_gpu");
68 inputVideo.
open(video);
73 inputVideo.
open(camId);
92 如果 (!detector->setNet(net))
94 cout <<
"加载模型失败: 中断" << endl;
100 Mat image, imageCopy;
103 imageCopy = image.
clone();
106 如果 (!detector->process(image, chartType, nc,
真))
108 printf(
"未检测到 ChartColor \n");
114 std::vector<Ptr<mcc::CChecker>> checkers = detector->getListColorChecker();
124 imshow(
"图像结果 | 按 q 或 esc 退出", image);
126 char key = (char)
waitKey(waitTime);
设计用于命令行解析。
定义 utility.hpp:820
CV_NODISCARD_STD Mat clone() const
创建数组和底层数据的完整副本。
从视频文件、图像序列或摄像头视频捕捉的类。
定义 videoio.hpp:731
virtual bool open(const String &filename, int apiPreference=CAP_ANY)
打开视频文件或捕捉设备或 IP 视频流以进行视频捕捉。
virtual bool retrieve(OutputArray image, int flag=0)
解码并返回捕捉到的视频帧。
virtual bool grab()
从视频文件或捕捉设备获取下一帧。
此类允许创建和操作综合人工神经网络。
定义 dnn.hpp:475
void setPreferableBackend(int backendId)
要求网络在支持的情况下使用特定的计算后端。
void setPreferableTarget(int targetId)
要求网络在特定的目标设备上进行计算。
std::string String
定义 cvstd.hpp:151
std::shared_ptr< _Tp > Ptr
定义 cvstd_wrapper.hpp:23
#define CV_Assert(expr)
运行时检查条件并如果失败则抛出异常。
定义 base.hpp:342
Net readNetFromTensorflow(CV_WRAP_FILE_PATH const String &model, CV_WRAP_FILE_PATH const String &config=String())
读取以 TensorFlow 框架格式存储的网络模型。
void imshow(const String &winname, InputArray mat)
在指定窗口中显示图像。
int waitKey(int delay=0)
等待按下一个键。
int main(int argc, char *argv[])
定义 highgui_qt.cpp:3
与磁盘上的文件关联的文件存储的“黑盒”表示形式。
定义 core.hpp:102
说明
设置头文件和命名空间
如果您愿意,可以像上述代码一样设置命名空间。
创建检测器对象
这仅仅是用于创建对象。
加载模型
在其中模型通过提供的模型在 tensorflow 中进行了训练,因此我们正在 tensorflow 中加载该模型,但是如果你在其他框架中训练了某些其他模型,你也可以使用该模型,只需加载该模型。
**(可选) 将 dnn 后端设置为 CUDA**
模型在 CUDA 上运行得要快得多,因此如果可能,使用 CUDA。
运行检测器
detector->process(image, chartType, max_number_charts_in_image, true);
如果检测器成功至少检测到一个图表,则返回 true,否则返回 false。在上面给出的代码中,如果没有检测到图表,我们打印一条失败消息。否则,如果成功,颜色图表的列表将存储在检测器本身中,我们将看到下一步如何提取它。第四个参数是用于决定是否使用该网络。
获取颜色图表的列表
std::vector<cv::Ptr<mcc::CChecker>> checkers;
detector->getListColorChecker(checkers);
现在,“checkers”向量中存储了检测到的所有颜色图表。
重绘制图像中的颜色图表
逐个循环遍历所有图表,然后绘制它们。