OpenCV  4.10.0
开源计算机视觉
正在加载...
正在搜索...
未找到任何匹配项
使用基本算法检测对色卡

本教程将介绍如何使用“mcc”模块检测图像中的色卡。这里我们仅使用基本检测算法。在下一节教程中,你将了解如何使用神经网络提高检测准确性。

构建

构建 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 -t=<type_of_chart> -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_to_look_for>
  • -t=# 为图表类型,其中 0(标准)、1(DigitalSG)、2(乙烯基)
  • –ci=# 为相机 ID,其中 0(默认为主相机)、1(辅助相机)等
  • –nc=# 默认值为 1,这意味着仅检测最佳图表

示例

在标准 Macbeth 色卡上运行电影
/home/opencv/build/bin/example_mcc_chart_detection -t=0 -v=mcc24.mp4
或在相机 0 中的乙烯基 Macbeth 色卡上运行
/home/opencv/build/bin/example_mcc_chart_detection -t=2 --ci=0
或在乙烯基 Macbeth 色卡上运行,检测获得最佳 5 张图表(检测结果可能少于 5 张,但绝不会多于 5 张)
/home/opencv/build/bin/example_mcc_chart_detection -t=2 --ci=0 --nc=5
1#include <opencv2/core.hpp>
2
3#include <opencv2/highgui.hpp>
4#include <opencv2/mcc.hpp>
5#include <iostream>
6
7using namespace std;
8using namespace cv;
9using namespace mcc;
10
11const char *about = "Basic chart detection";
12const char *keys = {
13 "{ help h usage ? | | 显示此消息 }"
14 "{t | | chartType: 0 标准, 1 数字 SG, 2 黑胶唱片 }"
15 "{v | | 来自视频文件输入, 如果省略, 输入来自摄像机 }"
16 "{ci | 0 | 如果输入不来自视频 ( -v ) 的摄像机 ID }"
17 "{nc | 1 | 图像中的最大图表数 }"};
18
19int main(int argc, char *argv[])
20{
21
22 // ----------------------------------------------------------
23 // 向下滚动一段距离 (~40 行) 以查找实际相关代码。
24 // ----------------------------------------------------------
25
26 CommandLineParser parser(argc, argv, keys);
27 parser.about(about);
28
29 int t = parser.get<int>("t");
30
31 CV_Assert(0 <= t && t <= 2);
32 TYPECHART chartType = TYPECHART(t);
33
34 int camId = parser.get<int>("ci");
35 int nc = parser.get<int>("nc");
36 String video;
37 if (parser.has("v"))
38 video = parser.get<String>("v");
39
40 if (!parser.check())
41 {
42 parser.printErrors();
43 return 0;
44 }
45
46 VideoCapture inputVideo;
47 int waitTime;
48 if (!video.empty())
49 {
50 inputVideo.open(video);
51 waitTime = 10;
52 }
53 否则
54 {
55 inputVideo.打开(camId);
56 waitTime = 10;
57 }
58
59 //--------------------------------------------------------------------------
60 //-------------------------实际相关代码-----------------------------
61 //--------------------------------------------------------------------------
62
63 (inputVideo.获取())
64 {
65
66 垫子 image, imageCopy;
67 inputVideo.检索(image);
68 imageCopy = image.克隆();
69 Ptr<CCheckerDetector> detector = CCheckerDetector::create();
70 // 检测标记类型
71 如果 (!detector->process(image, chartType, nc))
72 {
73 printf("未检测到图表颜色 \n");
74 }
75 否则
76 {
77
78 // 获取检查器
79 std::vector<Ptr<mcc::CChecker>> checkers = detector->getListColorChecker();
80
81 对于 (Ptr<mcc::CChecker> checker : checkers)
82 {
83 // 当前检查器
84 Ptr<CCheckerDraw> cdraw = CCheckerDraw::create(checker);
85 cdraw->draw(image);
86 }
87 }
88 imshow("图像结果 | q 或 esc 退出", image);
89 imshow("原始", imageCopy);
90 字符 key = (char)waitKey(waitTime);
91 如果 (key == 27)
92 break
93 }
94
95 return 0;
96}
用于命令行解析。
定义 utility.hpp:820
n 维度密集数组类
定义 mat.hpp:812
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()
从视频文件或采集设备抓取下一帧。
std::string String
定义 cvstd.hpp:151
std::shared_ptr< _Tp > Ptr
定义 cvstd_wrapper.hpp:23
#define CV_Assert(expr)
运行时检查条件,如果失败则抛出异常。
定义 base.hpp:342
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
STL 命名空间。

说明

  1. 设置头和命名空间

    #include <opencv2/mcc.hpp>
    using namespace std;
    using namespace cv;
    using namespace mcc;

    如果愿意,可以将命名空间设置为以上代码所示。

  2. 创建检测器对象

    Ptr<CCheckerDetector> detector = CCheckerDetector::create();

    这只是创建对象。

  3. 运行检测器

    detector->process(image, chartType);

    如果检测器成功地检测一张图表,则返回 true,否则返回 false。在上述给出的代码中,如果未检测到任何图表,我们将打印失败消息。否则,如果成功,色卡列表将存储在检测器本身内,我们将在下一步中看到如何提取它。默认情况下,它将检测至多一张图表,但你可以调整第三个参数 nc(最大图表数量),以检测更多图表。

  4. 获取颜色检测器列表

    std::vector<cv::Ptr<mcc::CChecker>> checkers;
    detector->getListColorChecker(checkers);

    所有检测到的颜色检测器现在都存储在“checkers”向量中。

  5. 将颜色检测器绘制回图像

    for(Ptr<mcc::CChecker> checker : checkers)
    {
    // 当前检测器
    Ptr<CCheckerDraw> cdraw = CCheckerDraw::create(checker);
    cdraw->draw(image);
    }

    逐一循环所有检测器,然后绘制它们。