Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Greenplum
Opencv
提交
fe14e7ab
O
Opencv
项目概览
Greenplum
/
Opencv
10 个月 前同步成功
通知
7
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
O
Opencv
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
未验证
提交
fe14e7ab
编写于
6月 09, 2023
作者:
A
Alexander Smorkalov
提交者:
GitHub
6月 09, 2023
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #23758 from AleksandrPanov:add_GenericGraphicalCode_interface
Add graphical code detector interface
上级
472aad46
b729d8e8
变更
8
隐藏空白更改
内联
并排
Showing
8 changed file
with
166 addition
and
132 deletion
+166
-132
modules/objdetect/include/opencv2/objdetect.hpp
modules/objdetect/include/opencv2/objdetect.hpp
+3
-75
modules/objdetect/include/opencv2/objdetect/graphical_code_detector.hpp
...ect/include/opencv2/objdetect/graphical_code_detector.hpp
+81
-0
modules/objdetect/perf/perf_qrcode_pipeline.cpp
modules/objdetect/perf/perf_qrcode_pipeline.cpp
+2
-2
modules/objdetect/src/graphical_code_detector.cpp
modules/objdetect/src/graphical_code_detector.cpp
+45
-0
modules/objdetect/src/graphical_code_detector_impl.hpp
modules/objdetect/src/graphical_code_detector_impl.hpp
+25
-0
modules/objdetect/src/qrcode.cpp
modules/objdetect/src/qrcode.cpp
+2
-47
modules/objdetect/test/test_qrcode.cpp
modules/objdetect/test/test_qrcode.cpp
+4
-4
samples/cpp/qrcode.cpp
samples/cpp/qrcode.cpp
+4
-4
未找到文件。
modules/objdetect/include/opencv2/objdetect.hpp
浏览文件 @
fe14e7ab
...
...
@@ -46,6 +46,7 @@
#include "opencv2/core.hpp"
#include "opencv2/objdetect/aruco_detector.hpp"
#include "opencv2/objdetect/graphical_code_detector.hpp"
/**
@defgroup objdetect Object Detection
...
...
@@ -763,80 +764,7 @@ public:
CV_WRAP
virtual
void
encodeStructuredAppend
(
const
String
&
encoded_info
,
OutputArrayOfArrays
qrcodes
)
=
0
;
};
class
CV_EXPORTS_W_SIMPLE
QRCodeDetectorBase
{
public:
CV_DEPRECATED_EXTERNAL
// avoid using in C++ code, will be moved to "protected" (need to fix bindings first)
QRCodeDetectorBase
();
QRCodeDetectorBase
(
const
QRCodeDetectorBase
&
)
=
default
;
QRCodeDetectorBase
(
QRCodeDetectorBase
&&
)
=
default
;
QRCodeDetectorBase
&
operator
=
(
const
QRCodeDetectorBase
&
)
=
default
;
QRCodeDetectorBase
&
operator
=
(
QRCodeDetectorBase
&&
)
=
default
;
/** @brief Detects QR code in image and returns the quadrangle containing the code.
@param img grayscale or color (BGR) image containing (or not) QR code.
@param points Output vector of vertices of the minimum-area quadrangle containing the code.
*/
CV_WRAP
bool
detect
(
InputArray
img
,
OutputArray
points
)
const
;
/** @brief Decodes QR code in image once it's found by the detect() method.
Returns UTF8-encoded output string or empty string if the code cannot be decoded.
@param img grayscale or color (BGR) image containing QR code.
@param points Quadrangle vertices found by detect() method (or some other algorithm).
@param straight_qrcode The optional output image containing rectified and binarized QR code
*/
CV_WRAP
std
::
string
decode
(
InputArray
img
,
InputArray
points
,
OutputArray
straight_qrcode
=
noArray
())
const
;
/** @brief Both detects and decodes QR code
@param img grayscale or color (BGR) image containing QR code.
@param points optional output array of vertices of the found QR code quadrangle. Will be empty if not found.
@param straight_qrcode The optional output image containing rectified and binarized QR code
*/
CV_WRAP
std
::
string
detectAndDecode
(
InputArray
img
,
OutputArray
points
=
noArray
(),
OutputArray
straight_qrcode
=
noArray
())
const
;
/** @brief Detects QR codes in image and returns the vector of the quadrangles containing the codes.
@param img grayscale or color (BGR) image containing (or not) QR codes.
@param points Output vector of vector of vertices of the minimum-area quadrangle containing the codes.
*/
CV_WRAP
bool
detectMulti
(
InputArray
img
,
OutputArray
points
)
const
;
/** @brief Decodes QR codes in image once it's found by the detect() method.
@param img grayscale or color (BGR) image containing QR codes.
@param decoded_info UTF8-encoded output vector of string or empty vector of string if the codes cannot be decoded.
@param points vector of Quadrangle vertices found by detect() method (or some other algorithm).
@param straight_qrcode The optional output vector of images containing rectified and binarized QR codes
*/
CV_WRAP
bool
decodeMulti
(
InputArray
img
,
InputArray
points
,
CV_OUT
std
::
vector
<
std
::
string
>&
decoded_info
,
OutputArrayOfArrays
straight_qrcode
=
noArray
()
)
const
;
/** @brief Both detects and decodes QR codes
@param img grayscale or color (BGR) image containing QR codes.
@param decoded_info UTF8-encoded output vector of string or empty vector of string if the codes cannot be decoded.
@param points optional output vector of vertices of the found QR code quadrangles. Will be empty if not found.
@param straight_qrcode The optional output vector of images containing rectified and binarized QR codes
*/
CV_WRAP
bool
detectAndDecodeMulti
(
InputArray
img
,
CV_OUT
std
::
vector
<
std
::
string
>&
decoded_info
,
OutputArray
points
=
noArray
(),
OutputArrayOfArrays
straight_qrcode
=
noArray
()
)
const
;
struct
Impl
;
protected:
Ptr
<
Impl
>
p
;
};
class
CV_EXPORTS_W_SIMPLE
QRCodeDetector
:
public
QRCodeDetectorBase
class
CV_EXPORTS_W_SIMPLE
QRCodeDetector
:
public
GraphicalCodeDetector
{
public:
CV_WRAP
QRCodeDetector
();
...
...
@@ -877,7 +805,7 @@ public:
OutputArray
straight_qrcode
=
noArray
());
};
class
CV_EXPORTS_W_SIMPLE
QRCodeDetectorAruco
:
public
QRCodeDetectorBase
{
class
CV_EXPORTS_W_SIMPLE
QRCodeDetectorAruco
:
public
GraphicalCodeDetector
{
public:
CV_WRAP
QRCodeDetectorAruco
();
...
...
modules/objdetect/include/opencv2/objdetect/graphical_code_detector.hpp
0 → 100644
浏览文件 @
fe14e7ab
// This file is part of OpenCV project.
// It is subject to the license terms in the LICENSE file found in the top-level directory
// of this distribution and at http://opencv.org/license.html
#ifndef OPENCV_OBJDETECT_GRAPHICAL_CODE_DETECTOR_HPP
#define OPENCV_OBJDETECT_GRAPHICAL_CODE_DETECTOR_HPP
#include <opencv2/core.hpp>
namespace
cv
{
//! @addtogroup objdetect_common
//! @{
class
CV_EXPORTS_W_SIMPLE
GraphicalCodeDetector
{
public:
CV_DEPRECATED_EXTERNAL
// avoid using in C++ code, will be moved to "protected" (need to fix bindings first)
GraphicalCodeDetector
();
GraphicalCodeDetector
(
const
GraphicalCodeDetector
&
)
=
default
;
GraphicalCodeDetector
(
GraphicalCodeDetector
&&
)
=
default
;
GraphicalCodeDetector
&
operator
=
(
const
GraphicalCodeDetector
&
)
=
default
;
GraphicalCodeDetector
&
operator
=
(
GraphicalCodeDetector
&&
)
=
default
;
/** @brief Detects graphical code in image and returns the quadrangle containing the code.
@param img grayscale or color (BGR) image containing (or not) graphical code.
@param points Output vector of vertices of the minimum-area quadrangle containing the code.
*/
CV_WRAP
bool
detect
(
InputArray
img
,
OutputArray
points
)
const
;
/** @brief Decodes graphical code in image once it's found by the detect() method.
Returns UTF8-encoded output string or empty string if the code cannot be decoded.
@param img grayscale or color (BGR) image containing graphical code.
@param points Quadrangle vertices found by detect() method (or some other algorithm).
@param straight_code The optional output image containing binarized code, will be empty if not found.
*/
CV_WRAP
std
::
string
decode
(
InputArray
img
,
InputArray
points
,
OutputArray
straight_code
=
noArray
())
const
;
/** @brief Both detects and decodes graphical code
@param img grayscale or color (BGR) image containing graphical code.
@param points optional output array of vertices of the found graphical code quadrangle, will be empty if not found.
@param straight_code The optional output image containing binarized code
*/
CV_WRAP
std
::
string
detectAndDecode
(
InputArray
img
,
OutputArray
points
=
noArray
(),
OutputArray
straight_code
=
noArray
())
const
;
/** @brief Detects graphical codes in image and returns the vector of the quadrangles containing the codes.
@param img grayscale or color (BGR) image containing (or not) graphical codes.
@param points Output vector of vector of vertices of the minimum-area quadrangle containing the codes.
*/
CV_WRAP
bool
detectMulti
(
InputArray
img
,
OutputArray
points
)
const
;
/** @brief Decodes graphical codes in image once it's found by the detect() method.
@param img grayscale or color (BGR) image containing graphical codes.
@param decoded_info UTF8-encoded output vector of string or empty vector of string if the codes cannot be decoded.
@param points vector of Quadrangle vertices found by detect() method (or some other algorithm).
@param straight_code The optional output vector of images containing binarized codes
*/
CV_WRAP
bool
decodeMulti
(
InputArray
img
,
InputArray
points
,
CV_OUT
std
::
vector
<
std
::
string
>&
decoded_info
,
OutputArrayOfArrays
straight_code
=
noArray
())
const
;
/** @brief Both detects and decodes graphical codes
@param img grayscale or color (BGR) image containing graphical codes.
@param decoded_info UTF8-encoded output vector of string or empty vector of string if the codes cannot be decoded.
@param points optional output vector of vertices of the found graphical code quadrangles. Will be empty if not found.
@param straight_code The optional vector of images containing binarized codes
*/
CV_WRAP
bool
detectAndDecodeMulti
(
InputArray
img
,
CV_OUT
std
::
vector
<
std
::
string
>&
decoded_info
,
OutputArray
points
=
noArray
(),
OutputArrayOfArrays
straight_code
=
noArray
())
const
;
struct
Impl
;
protected:
Ptr
<
Impl
>
p
;
};
//! @}
}
#endif
\ No newline at end of file
modules/objdetect/perf/perf_qrcode_pipeline.cpp
浏览文件 @
fe14e7ab
...
...
@@ -68,7 +68,7 @@ PERF_TEST_P_(Perf_Objdetect_QRCode_Multi, detectMulti)
Mat
src
=
imread
(
image_path
);
ASSERT_FALSE
(
src
.
empty
())
<<
"Can't read image: "
<<
image_path
;
std
::
vector
<
Point
>
corners
;
QRCodeDetectorBase
qrcode
=
QRCodeDetector
();
GraphicalCodeDetector
qrcode
=
QRCodeDetector
();
if
(
method
==
"aruco_based"
)
{
qrcode
=
QRCodeDetectorAruco
();
}
...
...
@@ -90,7 +90,7 @@ PERF_TEST_P_(Perf_Objdetect_QRCode_Multi, decodeMulti)
if
(
disabled_samples
.
find
({
name_current_image
,
method
})
!=
disabled_samples
.
end
())
{
throw
SkipTestException
(
name_current_image
+
" is disabled sample for method "
+
method
);
}
QRCodeDetectorBase
qrcode
=
QRCodeDetector
();
GraphicalCodeDetector
qrcode
=
QRCodeDetector
();
if
(
method
==
"aruco_based"
)
{
qrcode
=
QRCodeDetectorAruco
();
}
...
...
modules/objdetect/src/graphical_code_detector.cpp
0 → 100644
浏览文件 @
fe14e7ab
// This file is part of OpenCV project.
// It is subject to the license terms in the LICENSE file found in the top-level directory
// of this distribution and at http://opencv.org/license.html
#include "precomp.hpp"
#include "opencv2/objdetect/graphical_code_detector.hpp"
#include "graphical_code_detector_impl.hpp"
namespace
cv
{
GraphicalCodeDetector
::
GraphicalCodeDetector
()
{}
bool
GraphicalCodeDetector
::
detect
(
InputArray
img
,
OutputArray
points
)
const
{
CV_Assert
(
p
);
return
p
->
detect
(
img
,
points
);
}
std
::
string
GraphicalCodeDetector
::
decode
(
InputArray
img
,
InputArray
points
,
OutputArray
straight_code
)
const
{
CV_Assert
(
p
);
return
p
->
decode
(
img
,
points
,
straight_code
);
}
std
::
string
GraphicalCodeDetector
::
detectAndDecode
(
InputArray
img
,
OutputArray
points
,
OutputArray
straight_code
)
const
{
CV_Assert
(
p
);
return
p
->
detectAndDecode
(
img
,
points
,
straight_code
);
}
bool
GraphicalCodeDetector
::
detectMulti
(
InputArray
img
,
OutputArray
points
)
const
{
CV_Assert
(
p
);
return
p
->
detectMulti
(
img
,
points
);
}
bool
GraphicalCodeDetector
::
decodeMulti
(
InputArray
img
,
InputArray
points
,
std
::
vector
<
std
::
string
>&
decoded_info
,
OutputArrayOfArrays
straight_code
)
const
{
CV_Assert
(
p
);
return
p
->
decodeMulti
(
img
,
points
,
decoded_info
,
straight_code
);
}
bool
GraphicalCodeDetector
::
detectAndDecodeMulti
(
InputArray
img
,
std
::
vector
<
std
::
string
>&
decoded_info
,
OutputArray
points
,
OutputArrayOfArrays
straight_code
)
const
{
CV_Assert
(
p
);
return
p
->
detectAndDecodeMulti
(
img
,
decoded_info
,
points
,
straight_code
);
}
}
modules/objdetect/src/graphical_code_detector_impl.hpp
0 → 100644
浏览文件 @
fe14e7ab
// This file is part of OpenCV project.
// It is subject to the license terms in the LICENSE file found in the top-level directory
// of this distribution and at http://opencv.org/license.html
#ifndef OPENCV_OBJDETECT_GRAPHICAL_CODE_DETECTOR_IMPL_HPP
#define OPENCV_OBJDETECT_GRAPHICAL_CODE_DETECTOR_IMPL_HPP
#include <opencv2/core.hpp>
namespace
cv
{
struct
GraphicalCodeDetector
::
Impl
{
virtual
~
Impl
()
{}
virtual
bool
detect
(
InputArray
img
,
OutputArray
points
)
const
=
0
;
virtual
std
::
string
decode
(
InputArray
img
,
InputArray
points
,
OutputArray
straight_code
)
const
=
0
;
virtual
std
::
string
detectAndDecode
(
InputArray
img
,
OutputArray
points
,
OutputArray
straight_code
)
const
=
0
;
virtual
bool
detectMulti
(
InputArray
img
,
OutputArray
points
)
const
=
0
;
virtual
bool
decodeMulti
(
InputArray
img
,
InputArray
points
,
std
::
vector
<
std
::
string
>&
decoded_info
,
OutputArrayOfArrays
straight_code
)
const
=
0
;
virtual
bool
detectAndDecodeMulti
(
InputArray
img
,
std
::
vector
<
std
::
string
>&
decoded_info
,
OutputArray
points
,
OutputArrayOfArrays
straight_code
)
const
=
0
;
};
}
#endif
\ No newline at end of file
modules/objdetect/src/qrcode.cpp
浏览文件 @
fe14e7ab
...
...
@@ -9,6 +9,7 @@
#include "opencv2/objdetect.hpp"
#include "opencv2/calib3d.hpp"
#include <opencv2/core/utils/logger.hpp>
#include "graphical_code_detector_impl.hpp"
#ifdef HAVE_QUIRC
#include "quirc.h"
...
...
@@ -950,53 +951,7 @@ vector<Point2f> QRDetect::getQuadrilateral(vector<Point2f> angle_list)
return
result_angle_list
;
}
struct
QRCodeDetectorBase
::
Impl
{
virtual
~
Impl
()
{}
virtual
bool
detect
(
InputArray
img
,
OutputArray
points
)
const
=
0
;
virtual
std
::
string
decode
(
InputArray
img
,
InputArray
points
,
OutputArray
straight_qrcode
)
const
=
0
;
virtual
std
::
string
detectAndDecode
(
InputArray
img
,
OutputArray
points
,
OutputArray
straight_qrcode
)
const
=
0
;
virtual
bool
detectMulti
(
InputArray
img
,
OutputArray
points
)
const
=
0
;
virtual
bool
decodeMulti
(
InputArray
img
,
InputArray
points
,
std
::
vector
<
std
::
string
>&
decoded_info
,
OutputArrayOfArrays
straight_qrcode
)
const
=
0
;
virtual
bool
detectAndDecodeMulti
(
InputArray
img
,
std
::
vector
<
std
::
string
>&
decoded_info
,
OutputArray
points
,
OutputArrayOfArrays
straight_qrcode
)
const
=
0
;
};
QRCodeDetectorBase
::
QRCodeDetectorBase
()
{}
bool
QRCodeDetectorBase
::
detect
(
InputArray
img
,
OutputArray
points
)
const
{
CV_Assert
(
p
);
return
p
->
detect
(
img
,
points
);
}
std
::
string
QRCodeDetectorBase
::
decode
(
InputArray
img
,
InputArray
points
,
OutputArray
straight_qrcode
)
const
{
CV_Assert
(
p
);
return
p
->
decode
(
img
,
points
,
straight_qrcode
);
}
std
::
string
QRCodeDetectorBase
::
detectAndDecode
(
InputArray
img
,
OutputArray
points
,
OutputArray
straight_qrcode
)
const
{
CV_Assert
(
p
);
return
p
->
detectAndDecode
(
img
,
points
,
straight_qrcode
);
}
bool
QRCodeDetectorBase
::
detectMulti
(
InputArray
img
,
OutputArray
points
)
const
{
CV_Assert
(
p
);
return
p
->
detectMulti
(
img
,
points
);
}
bool
QRCodeDetectorBase
::
decodeMulti
(
InputArray
img
,
InputArray
points
,
std
::
vector
<
std
::
string
>&
decoded_info
,
OutputArrayOfArrays
straight_qrcode
)
const
{
CV_Assert
(
p
);
return
p
->
decodeMulti
(
img
,
points
,
decoded_info
,
straight_qrcode
);
}
bool
QRCodeDetectorBase
::
detectAndDecodeMulti
(
InputArray
img
,
std
::
vector
<
std
::
string
>&
decoded_info
,
OutputArray
points
,
OutputArrayOfArrays
straight_qrcode
)
const
{
CV_Assert
(
p
);
return
p
->
detectAndDecodeMulti
(
img
,
decoded_info
,
points
,
straight_qrcode
);
}
struct
ImplContour
:
public
QRCodeDetectorBase
::
Impl
struct
ImplContour
:
public
GraphicalCodeDetector
::
Impl
{
public:
ImplContour
()
:
epsX
(
0.2
),
epsY
(
0.1
)
{}
...
...
modules/objdetect/test/test_qrcode.cpp
浏览文件 @
fe14e7ab
...
...
@@ -369,7 +369,7 @@ TEST_P(Objdetect_QRCode_Multi, regression)
ASSERT_FALSE
(
src
.
empty
())
<<
"Can't read image: "
<<
image_path
;
if
(
disabled_samples
.
find
({
name_current_image
,
method
})
!=
disabled_samples
.
end
())
throw
SkipTestException
(
name_current_image
+
" is disabled sample for method "
+
method
);
QRCodeDetectorBase
qrcode
=
QRCodeDetector
();
GraphicalCodeDetector
qrcode
=
QRCodeDetector
();
if
(
method
==
"aruco_based"
)
{
qrcode
=
QRCodeDetectorAruco
();
}
...
...
@@ -427,7 +427,7 @@ TEST_P(Objdetect_QRCode_detectMulti, detect_regression_16961)
Mat
src
=
imread
(
image_path
);
ASSERT_FALSE
(
src
.
empty
())
<<
"Can't read image: "
<<
image_path
;
QRCodeDetectorBase
qrcode
=
QRCodeDetector
();
GraphicalCodeDetector
qrcode
=
QRCodeDetector
();
if
(
method
==
"aruco_based"
)
{
qrcode
=
QRCodeDetectorAruco
();
}
...
...
@@ -450,7 +450,7 @@ TEST_P(Objdetect_QRCode_detectAndDecodeMulti, check_output_parameters_type_19363
Mat
src
=
imread
(
image_path
);
ASSERT_FALSE
(
src
.
empty
())
<<
"Can't read image: "
<<
image_path
;
#ifdef HAVE_QUIRC
QRCodeDetectorBase
qrcode
=
QRCodeDetector
();
GraphicalCodeDetector
qrcode
=
QRCodeDetector
();
if
(
method
==
"aruco_based"
)
{
qrcode
=
QRCodeDetectorAruco
();
}
...
...
@@ -619,7 +619,7 @@ TEST_P(Objdetect_QRCode_detectAndDecodeMulti, decode_9_qrcodes_version7)
std
::
string
image_path
=
findDataFile
(
root
+
name_current_image
);
Mat
src
=
imread
(
image_path
);
const
std
::
string
method
=
GetParam
();
QRCodeDetectorBase
qrcode
=
QRCodeDetector
();
GraphicalCodeDetector
qrcode
=
QRCodeDetector
();
if
(
method
==
"aruco_based"
)
{
qrcode
=
QRCodeDetectorAruco
();
}
...
...
samples/cpp/qrcode.cpp
浏览文件 @
fe14e7ab
...
...
@@ -160,7 +160,7 @@ void drawQRCodeResults(Mat& frame, const vector<Point>& corners, const vector<cv
static
void
runQR
(
const
QRCodeDetectorBase
&
qrcode
,
const
Mat
&
input
,
const
GraphicalCodeDetector
&
qrcode
,
const
Mat
&
input
,
vector
<
Point
>&
corners
,
vector
<
cv
::
String
>&
decode_info
// +global: bool g_modeMultiQR, bool g_detectOnly
)
...
...
@@ -194,7 +194,7 @@ void runQR(
}
static
double
processQRCodeDetection
(
const
QRCodeDetectorBase
&
qrcode
,
const
Mat
&
input
,
Mat
&
result
,
vector
<
Point
>&
corners
)
double
processQRCodeDetection
(
const
GraphicalCodeDetector
&
qrcode
,
const
Mat
&
input
,
Mat
&
result
,
vector
<
Point
>&
corners
)
{
if
(
input
.
channels
()
==
1
)
cvtColor
(
input
,
result
,
COLOR_GRAY2BGR
);
...
...
@@ -232,7 +232,7 @@ int liveQRCodeDetect()
cout
<<
"Press 'd' to switch between decoder and detector"
<<
endl
;
cout
<<
"Press ' ' (space) to save result into images"
<<
endl
;
cout
<<
"Press 'ESC' to exit"
<<
endl
;
QRCodeDetectorBase
qrcode
=
QRCodeDetector
();
GraphicalCodeDetector
qrcode
=
QRCodeDetector
();
if
(
g_useArucoBased
)
qrcode
=
QRCodeDetectorAruco
();
...
...
@@ -315,7 +315,7 @@ int imageQRCodeDetect(const string& in_file)
<<
" on image: "
<<
input
.
size
()
<<
" ("
<<
typeToString
(
input
.
type
())
<<
")"
<<
endl
;
QRCodeDetectorBase
qrcode
=
QRCodeDetector
();
GraphicalCodeDetector
qrcode
=
QRCodeDetector
();
if
(
g_useArucoBased
)
qrcode
=
QRCodeDetectorAruco
();
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录