在本教程中,您将学习如何使用“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。
示例的源代码
run
<您的 opencv 构建目录的路径>/bin/example_mcc_chart_detection -t=<图表类型> -v=<可选的视频路径,如果未提供,将使用网络摄像头.mp4> --ci=<可选的相机 ID,仅在未提供视频时需要> --nc=<要查找的可选的最大图表数>
- -t=# 是图表类型,其中 0 (标准),1 (DigitalSG),2 (Vinyl)
- –ci=# 是相机 ID,其中 0 (默认是主摄像头),1 (辅助摄像头) 等
- –nc=# 默认值为 1,这意味着只会检测到最佳图表
示例
在标准 macbeth 图表上运行电影
/home/opencv/build/bin/example_mcc_chart_detection -t=0 -v=mcc24.mp4
或者从相机 0 运行 vinyl macbeth 图表
/home/opencv/build/bin/example_mcc_chart_detection -t=2 --ci=0
或者运行 vinyl macbeth 图表,检测最佳 5 个图表(检测结果可能少于 5 个,但绝不会超过 5 个)
/home/opencv/build/bin/example_mcc_chart_detection -t=2 --ci=0 --nc=5
11const char *about =
"基本图表检测";
13 "{ help h usage ? | | 显示此消息 }"
14 "{t | | 图表类型:0-标准,1-DigitalSG,2-Vinyl }"
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);
55 inputVideo.
open(camId);
63 while (inputVideo.
grab())
68 imageCopy = image.
clone();
71 if (!detector->process(image, chartType, nc))
73 printf(
"未检测到 ChartColor \n");
79 std::vector<Ptr<mcc::CChecker>> checkers = detector->getListColorChecker();
88 imshow(
"图像结果 | q 或 esc 退出", image);
90 char key = (char)
waitKey(waitTime);
如果数组没有元素,则返回 true。
int64_t int64
CV_NODISCARD_STD Mat clone() const
创建数组及其底层数据的完整副本。
用于从视频文件、图像序列或相机捕获视频的类。
Definition videoio.hpp:772
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
Definition cvstd_wrapper.hpp:23
#define CV_Assert(expr)
在运行时检查条件,如果失败则抛出异常。
定义 base.hpp:423
void imshow(const String &winname, InputArray mat)
在指定窗口中显示图像。
int waitKey(int delay=0)
等待按键按下。
int main(int argc, char *argv[])
定义 highgui_qt.cpp:3
解释
设置头文件和命名空间
如果需要,您可以像上面的代码一样设置命名空间。
创建检测器对象
这只是为了创建对象。
运行检测器
detector->process(image, chartType);
如果检测器成功检测到至少一个图表,则返回 true,否则返回 false。在上面给出的代码中,如果没有检测到图表,我们会打印一条失败消息。否则,如果成功,颜色图表的列表将存储在检测器本身中,我们将在下一步中看到如何提取它。默认情况下,它最多检测到一个图表,但是您可以调整第三个参数 nc(最大图表数)以检测更多图表。
获取颜色检查器列表
std::vector<cv::Ptr<mcc::CChecker>> checkers;
detector->getListColorChecker(checkers);
所有检测到的色彩检查器现在都存储在“checkers”向量中。
将颜色检查器绘制回图像
逐个循环遍历所有检查器,然后绘制它们。