本教程将学习如何使用 '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。
示例源码
运行
<opencv_build_目录>/bin/example_mcc_chart_detection -t=<色卡类型> -v=<可选视频路径,未提供则使用摄像头.mp4> --ci=<仅在未提供视频时需要,摄像头ID> --nc=<可选,要查找的最大色卡数量>
- -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 =
"基本色卡检测";
13 "{ help h usage ? | | 显示此消息 }"
14 "{t | | 色卡类型: 0-标准, 1-DigitalSG, 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);
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);
用于命令行解析。
定义 utility.hpp:890
CV_NODISCARD_STD Mat clone() const
创建数组及其底层数据的完整副本。
用于从视频文件、图像序列或摄像头捕获视频的类。
定义 videoio.hpp:766
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:359
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”向量中。
将颜色检查器绘制回图像
逐一遍历所有检查器,然后绘制它们。