本教程将介绍如何使用“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
11const char *about =
"Basic chart detection";
13 "{ help h usage ? | | 显示此消息 }"
14 "{t | | chartType: 0 标准, 1 数字 SG, 2 黑胶唱片 }"
15 "{v | | 来自视频文件输入, 如果省略, 输入来自摄像机 }"
16 "{ci | 0 | 如果输入不来自视频 ( -v ) 的摄像机 ID }"
17 "{nc | 1 | 图像中的最大图表数 }"};
19int main(
int argc,
char *argv[])
29 int t = parser.get<
int>(
"t");
32 TYPECHART chartType = TYPECHART(t);
34 int camId = parser.get<
int>(
"ci");
35 int nc = parser.get<
int>(
"nc");
38 video = parser.get<
String>(
"v");
50 inputVideo.
open(video);
68 imageCopy = image.
克隆();
71 如果 (!detector->process(image, chartType, nc))
73 printf(
"未检测到图表颜色 \n");
79 std::vector<Ptr<mcc::CChecker>> checkers = detector->getListColorChecker();
88 imshow(
"图像结果 | q 或 esc 退出", image);
90 字符 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()
从视频文件或采集设备抓取下一帧。
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
说明
设置头和命名空间
如果愿意,可以将命名空间设置为以上代码所示。
创建检测器对象
这只是创建对象。
运行检测器
detector->process(image, chartType);
如果检测器成功地检测一张图表,则返回 true,否则返回 false。在上述给出的代码中,如果未检测到任何图表,我们将打印失败消息。否则,如果成功,色卡列表将存储在检测器本身内,我们将在下一步中看到如何提取它。默认情况下,它将检测至多一张图表,但你可以调整第三个参数 nc(最大图表数量),以检测更多图表。
获取颜色检测器列表
std::vector<cv::Ptr<mcc::CChecker>> checkers;
detector->getListColorChecker(checkers);
所有检测到的颜色检测器现在都存储在“checkers”向量中。
将颜色检测器绘制回图像
逐一循环所有检测器,然后绘制它们。