Skip to content

Commit ec3b836

Browse files
committed
First Commit
1 parent d0f61c4 commit ec3b836

File tree

622 files changed

+236184
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

622 files changed

+236184
-0
lines changed

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
.DS_Store
2+

CMakeLists.txt

+124
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
2+
3+
4+
qt6_add_qml_module(ocvdecoder
5+
URI ocvdecoder.decoder
6+
VERSION 1.0
7+
SOURCES
8+
ocvdecoder.h ocvdecoder.cpp
9+
)
10+
11+
12+
target_link_libraries(ocvdecoder
13+
PRIVATE Qt6::Quick Qt6::Multimedia
14+
-static-openmp -fopenmp
15+
)
16+
17+
target_include_directories(ocvdecoder PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/opencv/include/)
18+
19+
target_link_libraries(ocvdecoder PUBLIC Qt::CorePrivate)
20+
message(PROJECT_SOURCE_DIR=${ANDROID_ABI})
21+
if(IOS)
22+
target_link_libraries(ocvdecoder PRIVATE
23+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/ios/libopencv_hfs.a
24+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/ios/libopencv_rgbd.a
25+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/ios/libopencv_aruco.a
26+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/ios/libopencv_highgui.a
27+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/ios/libopencv_saliency.a
28+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/ios/libopencv_bgsegm.a
29+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/ios/libopencv_img_hash.a
30+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/ios/libopencv_shape.a
31+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/ios/libopencv_bioinspired.a
32+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/ios/libopencv_imgcodecs.a
33+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/ios/libopencv_structured_light.a
34+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/ios/libopencv_calib3d.a
35+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/ios/libopencv_imgproc.a
36+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/ios/libopencv_surface_matching.a
37+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/ios/libopencv_ccalib.a
38+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/ios/libopencv_intensity_transform.a
39+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/ios/libopencv_tracking.a
40+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/ios/libopencv_core.a
41+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/ios/libopencv_line_descriptor.a
42+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/ios/libopencv_video.a
43+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/ios/libopencv_dnn.a
44+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/ios/libopencv_mcc.a
45+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/ios/libopencv_videoio.a
46+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/ios/libopencv_dnn_objdetect.a
47+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/ios/libopencv_objdetect.a
48+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/ios/libopencv_videostab.a
49+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/ios/libopencv_dnn_superres.a
50+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/ios/libopencv_optflow.a
51+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/ios/libopencv_wechat_qrcode.a
52+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/ios/libopencv_dpm.a
53+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/ios/libopencv_phase_unwrapping.a
54+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/ios/libopencv_xfeatures2d.a
55+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/ios/libopencv_face.a
56+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/ios/libopencv_photo.a
57+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/ios/libopencv_ximgproc.a
58+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/ios/libopencv_xobjdetect.a
59+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/ios/libopencv_xphoto.a
60+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/ios/libopencv_features2d.a
61+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/ios/libopencv_plot.a
62+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/ios/libopencv_xobjdetect.a
63+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/ios/libopencv_xphoto.a
64+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/ios/libopencv_flann.a
65+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/ios/libopencv_rapid.a
66+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/ios/libopencv_fuzzy.a
67+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/ios/libopencv_reg.a
68+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/ios/libquirc.a
69+
)
70+
71+
endif()
72+
73+
if (ANDROID)
74+
75+
target_link_libraries(ocvdecoder PRIVATE
76+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/android/arm64-v8a/libopencv_hfs.a
77+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/android/arm64-v8a/libopencv_rgbd.a
78+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/android/arm64-v8a/libopencv_aruco.a
79+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/android/arm64-v8a/libopencv_highgui.a
80+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/android/arm64-v8a/libopencv_saliency.a
81+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/android/arm64-v8a/libopencv_bgsegm.a
82+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/android/arm64-v8a/libopencv_img_hash.a
83+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/android/arm64-v8a/libopencv_shape.a
84+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/android/arm64-v8a/libopencv_bioinspired.a
85+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/android/arm64-v8a/libopencv_imgcodecs.a
86+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/android/arm64-v8a/libopencv_structured_light.a
87+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/android/arm64-v8a/libopencv_calib3d.a
88+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/android/arm64-v8a/libopencv_imgproc.a
89+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/android/arm64-v8a/libopencv_surface_matching.a
90+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/android/arm64-v8a/libopencv_ccalib.a
91+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/android/arm64-v8a/libopencv_intensity_transform.a
92+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/android/arm64-v8a/libopencv_tracking.a
93+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/android/arm64-v8a/libopencv_core.a
94+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/android/arm64-v8a/libopencv_line_descriptor.a
95+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/android/arm64-v8a/libopencv_video.a
96+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/android/arm64-v8a/libopencv_dnn.a
97+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/android/arm64-v8a/libopencv_mcc.a
98+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/android/arm64-v8a/libopencv_videoio.a
99+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/android/arm64-v8a/libopencv_dnn_objdetect.a
100+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/android/arm64-v8a/libopencv_objdetect.a
101+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/android/arm64-v8a/libopencv_videostab.a
102+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/android/arm64-v8a/libopencv_dnn_superres.a
103+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/android/arm64-v8a/libopencv_optflow.a
104+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/android/arm64-v8a/libopencv_wechat_qrcode.a
105+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/android/arm64-v8a/libopencv_dpm.a
106+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/android/arm64-v8a/libopencv_phase_unwrapping.a
107+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/android/arm64-v8a/libopencv_xfeatures2d.a
108+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/android/arm64-v8a/libopencv_face.a
109+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/android/arm64-v8a/libopencv_photo.a
110+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/android/arm64-v8a/libopencv_ximgproc.a
111+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/android/arm64-v8a/libopencv_xobjdetect.a
112+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/android/arm64-v8a/libopencv_xphoto.a
113+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/android/arm64-v8a/libopencv_features2d.a
114+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/android/arm64-v8a/libopencv_plot.a
115+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/android/arm64-v8a/libopencv_xobjdetect.a
116+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/android/arm64-v8a/libopencv_xphoto.a
117+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/android/arm64-v8a/libopencv_flann.a
118+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/android/arm64-v8a/libopencv_rapid.a
119+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/android/arm64-v8a/libopencv_fuzzy.a
120+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/android/arm64-v8a/libopencv_reg.a
121+
${CMAKE_CURRENT_SOURCE_DIR}/opencv/android/arm64-v8a/libquirc.a
122+
)
123+
124+
endif()

ocvdecoder.cpp

+136
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
#include "ocvdecoder.h"
2+
#include <opencv2/opencv.hpp>
3+
#include <QUrl>
4+
#include <QtConcurrent/QtConcurrent>
5+
6+
using namespace std;
7+
8+
OCVDecoder::OCVDecoder(QObject *parent): QObject(parent)
9+
{
10+
m_detector = makePtr<wechat_qrcode::WeChatQRCode>("", "", "", "");
11+
}
12+
13+
void OCVDecoder::setFrame(const QVideoFrame &frame)
14+
{
15+
if(!isDecoding() && m_processThread.isFinished()) {
16+
m_decoding = true;
17+
QImage image = frame.toImage().convertToFormat(QImage::Format_RGB32).rgbSwapped();
18+
19+
m_processThread = QtConcurrent::run([=]() {
20+
21+
if(image.isNull()) {
22+
m_decoding = false;
23+
return;
24+
}
25+
26+
cv::Mat img(image.height(), image.width(), CV_8UC4, (void *) image.bits(), image.bytesPerLine());
27+
vector<Mat> points;
28+
auto res = m_detector->detectAndDecode(img, points);
29+
if (res.size() > 0) {
30+
for (const auto& value : res) {
31+
qDebug() << " opencv " << QString(value.c_str());
32+
emit decoded(QString(value.c_str()));
33+
}
34+
}
35+
m_decoding = false;
36+
});
37+
}
38+
39+
}
40+
41+
void OCVDecoder::setVideoSink(QObject *videoSync)
42+
{
43+
m_videoSink = qobject_cast<QVideoSink*>(videoSync);
44+
45+
if (m_videoSink) {
46+
QObject::connect(m_videoSink, &QVideoSink::videoFrameChanged,
47+
this, &OCVDecoder::setFrame);
48+
}
49+
}
50+
51+
52+
// https://asmaloney.com/2013/11/code/converting-between-cvmat-and-qimage-or-qpixmap/
53+
54+
static cv::Mat QImageToCvMat(QImage inImage, bool inCloneImageData = true)
55+
{
56+
switch ( inImage.format() )
57+
{
58+
// 8-bit, 4 channel
59+
case QImage::Format_ARGB32:
60+
case QImage::Format_ARGB32_Premultiplied:
61+
{
62+
cv::Mat mat( inImage.height(), inImage.width(),
63+
CV_8UC4,
64+
const_cast<uchar*>(inImage.bits()),
65+
static_cast<size_t>(inImage.bytesPerLine())
66+
);
67+
68+
return (inCloneImageData ? mat.clone() : mat);
69+
}
70+
71+
// 8-bit, 3 channel
72+
case QImage::Format_RGB32:
73+
{
74+
if ( !inCloneImageData ) {
75+
qWarning() << "QImageToCvMat() - Conversion requires cloning so we don't modify the original QImage data";
76+
}
77+
78+
cv::Mat mat( inImage.height(), inImage.width(),
79+
CV_8UC4,
80+
const_cast<uchar*>(inImage.bits()),
81+
static_cast<size_t>(inImage.bytesPerLine())
82+
);
83+
84+
cv::Mat matNoAlpha;
85+
86+
cv::cvtColor( mat, matNoAlpha, cv::COLOR_BGRA2BGR ); // drop the all-white alpha channel
87+
88+
return matNoAlpha;
89+
}
90+
91+
// 8-bit, 3 channel
92+
case QImage::Format_RGB888:
93+
{
94+
if ( !inCloneImageData ) {
95+
qWarning() << "QImageToCvMat() - Conversion requires cloning so we don't modify the original QImage data";
96+
}
97+
98+
QImage swapped = inImage.rgbSwapped();
99+
100+
cv::Mat mat( swapped.height(), swapped.width(),
101+
CV_8UC3,
102+
const_cast<uchar*>(swapped.bits()),
103+
static_cast<size_t>(swapped.bytesPerLine())
104+
);
105+
return (inCloneImageData ? mat.clone() : mat);
106+
}
107+
108+
// 8-bit, 1 channel
109+
case QImage::Format_Grayscale8:
110+
case QImage::Format_Indexed8:
111+
{
112+
cv::Mat mat( inImage.height(), inImage.width(),
113+
CV_8UC1,
114+
const_cast<uchar*>(inImage.bits()),
115+
static_cast<size_t>(inImage.bytesPerLine())
116+
);
117+
118+
return (inCloneImageData ? mat.clone() : mat);
119+
}
120+
121+
122+
#if QT_VERSION >= QT_VERSION_CHECK(5, 13, 0)
123+
case QImage::Format_Grayscale16:
124+
{
125+
cv::Mat mat(cv::Size(inImage.width(),inImage.height()),CV_16U,const_cast<uchar*>(inImage.bits()),cv::Mat::AUTO_STEP);
126+
return (inCloneImageData ? mat.clone() : mat);
127+
}
128+
#endif
129+
130+
default:
131+
qWarning() << "QImageToCvMat() - QImage format not handled in switch:" << inImage.format();
132+
break;
133+
}
134+
135+
return cv::Mat();
136+
}

ocvdecoder.h

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
#ifndef OCVDECODER_H
2+
#define OCVDECODER_H
3+
4+
#include <QObject>
5+
#include <QtMultimedia/QVideoSink>
6+
#include <QtMultimedia/QVideoFrame>
7+
#include "opencv2/wechat_qrcode.hpp"
8+
#include <qqml.h>
9+
#include <QFuture>
10+
11+
using namespace cv;
12+
13+
class OCVDecoder: public QObject
14+
{
15+
Q_OBJECT
16+
QML_ELEMENT
17+
Q_PROPERTY(QObject* videoSink WRITE setVideoSink)
18+
19+
public:
20+
OCVDecoder(QObject *parent = nullptr);
21+
void setVideoSink(QObject *videoSink);
22+
bool isDecoding() {return m_decoding; }
23+
24+
public slots:
25+
void setFrame(const QVideoFrame &frame);
26+
27+
28+
signals:
29+
void videoSyncChnaged();
30+
void decoded(const QString &qr);
31+
32+
private:
33+
QVideoSink *m_videoSink;
34+
Ptr<wechat_qrcode::WeChatQRCode> m_detector;
35+
QFuture<void> m_processThread;
36+
bool m_decoding;
37+
};
38+
39+
#endif // OCVDECODER_H
56.2 KB
Binary file not shown.
205 KB
Binary file not shown.
Binary file not shown.
3.38 MB
Binary file not shown.
425 KB
Binary file not shown.
4.99 MB
Binary file not shown.
7.02 MB
Binary file not shown.
Binary file not shown.
Binary file not shown.
140 KB
Binary file not shown.
911 KB
Binary file not shown.
1.26 MB
Binary file not shown.
1.09 MB
Binary file not shown.
70 KB
Binary file not shown.
114 KB
Binary file not shown.
263 KB
Binary file not shown.
165 KB
Binary file not shown.
290 KB
Binary file not shown.
5.34 MB
Binary file not shown.
Binary file not shown.
Binary file not shown.
827 KB
Binary file not shown.
1.65 MB
Binary file not shown.
531 KB
Binary file not shown.
Binary file not shown.
975 KB
Binary file not shown.
36.1 KB
Binary file not shown.
96.6 KB
Binary file not shown.
168 KB
Binary file not shown.
1.95 MB
Binary file not shown.
249 KB
Binary file not shown.
266 KB
Binary file not shown.
278 KB
Binary file not shown.
Binary file not shown.
189 KB
Binary file not shown.
Binary file not shown.
2.66 MB
Binary file not shown.
818 KB
Binary file not shown.
579 KB
Binary file not shown.
430 KB
Binary file not shown.
Binary file not shown.
3.41 MB
Binary file not shown.
2.23 MB
Binary file not shown.
Binary file not shown.
724 KB
Binary file not shown.

opencv/android/arm64-v8a/libquirc.a

28.9 KB
Binary file not shown.

0 commit comments

Comments
 (0)