Skip to content

Commit 68c6492

Browse files
committed
Revert "Add OCL support to improve performance"
This reverts commit 284c802.
1 parent 0ba7ba7 commit 68c6492

File tree

6 files changed

+50
-64
lines changed

6 files changed

+50
-64
lines changed

src/macro-external/video/macro-condition-video.cpp

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -83,11 +83,6 @@ const static std::map<tesseract::PageSegMode, std::string> pageSegModes = {
8383
"AdvSceneSwitcher.condition.video.ocrMode.sparseTextOSD"},
8484
};
8585

86-
MacroConditionVideo::MacroConditionVideo(Macro *m) : MacroCondition(m, true)
87-
{
88-
SetupOpenCL();
89-
}
90-
9186
cv::CascadeClassifier initObjectCascade(std::string &path)
9287
{
9388
cv::CascadeClassifier cascade;
@@ -266,7 +261,7 @@ bool MacroConditionVideo::SetLanguage(const std::string &language)
266261

267262
bool MacroConditionVideo::ScreenshotContainsPattern()
268263
{
269-
cv::UMat result;
264+
cv::Mat result;
270265
MatchPattern(_screenshotData.image, _patternImageData,
271266
_patternMatchParameters.threshold, result,
272267
_patternMatchParameters.useAlphaAsMask,
@@ -283,7 +278,7 @@ bool MacroConditionVideo::OutputChanged()
283278
return _screenshotData.image != _matchImage;
284279
}
285280

286-
cv::UMat result;
281+
cv::Mat result;
287282
_patternImageData = CreatePatternData(_matchImage);
288283
MatchPattern(_screenshotData.image, _patternImageData,
289284
_patternMatchParameters.threshold, result,

src/macro-external/video/macro-condition-video.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class PreviewDialog;
2525

2626
class MacroConditionVideo : public MacroCondition {
2727
public:
28-
MacroConditionVideo(Macro *m);
28+
MacroConditionVideo(Macro *m) : MacroCondition(m, true){};
2929
bool CheckCondition();
3030
bool Save(obs_data_t *obj) const;
3131
bool Load(obs_data_t *obj);

src/macro-external/video/opencv-helpers.cpp

Lines changed: 22 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
#include "opencv-helpers.hpp"
2-
#include "log-helper.hpp"
32

4-
#include <opencv2/core/ocl.hpp>
5-
#include <opencv2/core/mat.hpp>
3+
#include <log-helper.hpp>
64

75
namespace advss {
86

@@ -24,19 +22,17 @@ PatternImageData CreatePatternData(const QImage &pattern)
2422
return data;
2523
}
2624

27-
static void invertPatternMatchResult(cv::UMat &umat)
25+
static void invertPatternMatchResult(cv::Mat &mat)
2826
{
29-
auto mat = umat.getMat(cv::ACCESS_RW);
3027
for (int r = 0; r < mat.rows; r++) {
3128
for (int c = 0; c < mat.cols; c++) {
3229
mat.at<float>(r, c) = 1.0 - mat.at<float>(r, c);
3330
}
3431
}
35-
umat = mat.getUMat(cv::ACCESS_RW);
3632
}
3733

3834
void MatchPattern(QImage &img, const PatternImageData &patternData,
39-
double threshold, cv::UMat &result, bool useAlphaAsMask,
35+
double threshold, cv::Mat &result, bool useAlphaAsMask,
4036
cv::TemplateMatchModes matchMode)
4137
{
4238
if (img.isNull() || patternData.rgbaPattern.empty()) {
@@ -55,12 +51,13 @@ void MatchPattern(QImage &img, const PatternImageData &patternData,
5551
// thus should not be used while matching the pattern as well
5652
//
5753
// Input format is Format_RGBA8888 so discard the 4th channel
58-
std::vector<cv::UMat> inputChannels;
54+
std::vector<cv::Mat1b> inputChannels;
5955
cv::split(input, inputChannels);
60-
std::vector<cv::UMat> rgbChanlesImage(
56+
std::vector<cv::Mat1b> rgbChanlesImage(
6157
inputChannels.begin(), inputChannels.begin() + 3);
62-
cv::UMat rgbInput;
58+
cv::Mat3b rgbInput;
6359
cv::merge(rgbChanlesImage, rgbInput);
60+
6461
cv::matchTemplate(rgbInput, patternData.rgbPattern, result,
6562
matchMode, patternData.mask);
6663
} else {
@@ -79,7 +76,7 @@ void MatchPattern(QImage &img, const PatternImageData &patternData,
7976
}
8077

8178
void MatchPattern(QImage &img, QImage &pattern, double threshold,
82-
cv::UMat &result, bool useAlphaAsMask,
79+
cv::Mat &result, bool useAlphaAsMask,
8380
cv::TemplateMatchModes matchColor)
8481
{
8582
auto data = CreatePatternData(pattern);
@@ -96,12 +93,16 @@ std::vector<cv::Rect> MatchObject(QImage &img, cv::CascadeClassifier &cascade,
9693
}
9794

9895
auto image = QImageToMat(img);
99-
cv::UMat frameGray;
96+
cv::Mat frameGray;
10097
cv::cvtColor(image, frameGray, cv::COLOR_RGBA2GRAY);
10198
cv::equalizeHist(frameGray, frameGray);
10299
std::vector<cv::Rect> objects;
103-
cascade.detectMultiScale(frameGray, objects, scaleFactor, minNeighbors,
104-
0, minSize, maxSize);
100+
try {
101+
cascade.detectMultiScale(frameGray, objects, scaleFactor,
102+
minNeighbors, 0, minSize, maxSize);
103+
} catch (const std::exception &e) {
104+
vblog(LOG_INFO, "detectMultiScale failed: %s", e.what());
105+
}
105106
return objects;
106107
}
107108

@@ -111,9 +112,9 @@ uchar GetAvgBrightness(QImage &img)
111112
return 0;
112113
}
113114

114-
auto i = QImageToMat(img);
115+
auto image = QImageToMat(img);
115116
cv::Mat hsvImage, rgbImage;
116-
cv::cvtColor(i, rgbImage, cv::COLOR_RGBA2RGB);
117+
cv::cvtColor(image, rgbImage, cv::COLOR_RGBA2RGB);
117118
cv::cvtColor(rgbImage, hsvImage, cv::COLOR_RGB2HSV);
118119
long long brightnessSum = 0;
119120
for (int i = 0; i < hsvImage.rows; ++i) {
@@ -138,8 +139,7 @@ static bool colorIsSimilar(const QColor &color1, const QColor &color2,
138139
cv::Mat PreprocessForOCR(const QImage &image, const QColor &textColor,
139140
double colorDiff)
140141
{
141-
auto umat = QImageToMat(image);
142-
auto mat = umat.getMat(cv::ACCESS_RW);
142+
auto mat = QImageToMat(image);
143143

144144
// Tesseract works best when matching black text on a white background,
145145
// so everything that matches the text color will be displayed black
@@ -224,14 +224,13 @@ bool ContainsPixelsInColorRange(const QImage &image, const QColor &color,
224224

225225
// Assumption is that QImage uses Format_RGBA8888.
226226
// Conversion from: https://github.com/dbzhang800/QtOpenCV
227-
cv::UMat QImageToMat(const QImage &img)
227+
cv::Mat QImageToMat(const QImage &img)
228228
{
229229
if (img.isNull()) {
230-
return cv::UMat();
230+
return cv::Mat();
231231
}
232-
auto temp = cv::Mat(img.height(), img.width(), CV_8UC(img.depth() / 8),
233-
(uchar *)img.bits(), img.bytesPerLine());
234-
return temp.getUMat(cv::ACCESS_RW);
232+
return cv::Mat(img.height(), img.width(), CV_8UC(img.depth() / 8),
233+
(uchar *)img.bits(), img.bytesPerLine());
235234
}
236235

237236
QImage MatToQImage(const cv::Mat &mat)
@@ -243,12 +242,4 @@ QImage MatToQImage(const cv::Mat &mat)
243242
QImage::Format::Format_RGBA8888);
244243
}
245244

246-
void SetupOpenCL()
247-
{
248-
if (cv::ocl::haveOpenCL() && !cv::ocl::useOpenCL()) {
249-
blog(LOG_INFO, "enabled OpenCL support for OpenCV");
250-
cv::ocl::setUseOpenCL(true);
251-
}
252-
}
253-
254245
} // namespace advss

src/macro-external/video/opencv-helpers.hpp

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,17 +42,17 @@ constexpr int maxMinNeighbors = 6;
4242
constexpr double defaultScaleFactor = 1.1;
4343

4444
struct PatternImageData {
45-
cv::UMat rgbaPattern;
46-
cv::UMat rgbPattern;
47-
cv::UMat mask;
45+
cv::Mat4b rgbaPattern;
46+
cv::Mat3b rgbPattern;
47+
cv::Mat1b mask;
4848
};
4949

5050
PatternImageData CreatePatternData(const QImage &pattern);
5151
void MatchPattern(QImage &img, const PatternImageData &patternData,
52-
double threshold, cv::UMat &result, bool useAlphaAsMask,
52+
double threshold, cv::Mat &result, bool useAlphaAsMask,
5353
cv::TemplateMatchModes matchMode);
5454
void MatchPattern(QImage &img, QImage &pattern, double threshold,
55-
cv::UMat &result, bool useAlphaAsMask,
55+
cv::Mat &result, bool useAlphaAsMask,
5656
cv::TemplateMatchModes matchMode);
5757
std::vector<cv::Rect> MatchObject(QImage &img, cv::CascadeClassifier &cascade,
5858
double scaleFactor, int minNeighbors,
@@ -66,8 +66,7 @@ std::string RunOCR(tesseract::TessBaseAPI *, const QImage &, const QColor &,
6666
bool ContainsPixelsInColorRange(const QImage &image, const QColor &color,
6767
double colorDeviationThreshold,
6868
double totalPixelMatchThreshold);
69-
cv::UMat QImageToMat(const QImage &img);
69+
cv::Mat QImageToMat(const QImage &img);
7070
QImage MatToQImage(const cv::Mat &mat);
71-
void SetupOpenCL();
7271

7372
} // namespace advss

src/macro-external/video/preview-dialog.cpp

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ void PreviewDialog::PatternMatchParametersChanged(
122122
{
123123
std::unique_lock<std::mutex> lock(_mtx);
124124
_patternMatchParams = params;
125+
_patternImageData = CreatePatternData(_patternMatchParams.image);
125126
}
126127

127128
void PreviewDialog::ObjDetectParametersChanged(const ObjDetectParameters &params)
@@ -169,8 +170,8 @@ void PreviewDialog::UpdateImage(const QPixmap &image)
169170
if (_type == PreviewType::SELECT_AREA && !_selectingArea) {
170171
DrawFrame();
171172
}
172-
emit NeedImage(_video, _type, _patternMatchParams, _objDetectParams,
173-
_ocrParams, _areaParams, _condition);
173+
emit NeedImage(_video, _type, _patternMatchParams, _patternImageData,
174+
_objDetectParams, _ocrParams, _areaParams, _condition);
174175
}
175176

176177
void PreviewDialog::Start()
@@ -186,7 +187,7 @@ void PreviewDialog::Start()
186187
return;
187188
}
188189

189-
PreviewImage *worker = new PreviewImage(_mtx);
190+
auto worker = new PreviewImage(_mtx);
190191
worker->moveToThread(&_thread);
191192
connect(&_thread, &QThread::finished, worker, &QObject::deleteLater);
192193
connect(worker, &PreviewImage::ImageReady, this,
@@ -197,8 +198,8 @@ void PreviewDialog::Start()
197198
&PreviewImage::CreateImage);
198199
_thread.start();
199200

200-
emit NeedImage(_video, _type, _patternMatchParams, _objDetectParams,
201-
_ocrParams, _areaParams, _condition);
201+
emit NeedImage(_video, _type, _patternMatchParams, _patternImageData,
202+
_objDetectParams, _ocrParams, _areaParams, _condition);
202203
}
203204

204205
void PreviewDialog::DrawFrame()
@@ -216,22 +217,20 @@ void PreviewDialog::DrawFrame()
216217
_rubberBand->show();
217218
}
218219

219-
static void markPatterns(cv::UMat &matchResult, QImage &image,
220-
const cv::UMat &pattern)
220+
static void markPatterns(cv::Mat &matchResult, QImage &image,
221+
const cv::Mat &pattern)
221222
{
222-
auto temp = matchResult.getMat(cv::ACCESS_RW);
223223
auto matchImg = QImageToMat(image);
224-
for (int row = 0; row < temp.rows - 1; row++) {
225-
for (int col = 0; col < temp.cols - 1; col++) {
226-
if (temp.at<float>(row, col) != 0.0) {
224+
for (int row = 0; row < matchResult.rows - 1; row++) {
225+
for (int col = 0; col < matchResult.cols - 1; col++) {
226+
if (matchResult.at<float>(row, col) != 0.0) {
227227
rectangle(matchImg, {col, row},
228228
cv::Point(col + pattern.cols,
229229
row + pattern.rows),
230230
cv::Scalar(255, 0, 0, 255), 2, 8, 0);
231231
}
232232
}
233233
}
234-
matchResult = temp.getUMat(cv::ACCESS_RW);
235234
}
236235

237236
static void markObjects(QImage &image, std::vector<cv::Rect> &objects)
@@ -249,6 +248,7 @@ PreviewImage::PreviewImage(std::mutex &mtx) : _mtx(mtx) {}
249248

250249
void PreviewImage::CreateImage(const VideoInput &video, PreviewType type,
251250
const PatternMatchParameters &patternMatchParams,
251+
const PatternImageData &patternImageData,
252252
ObjDetectParameters objDetectParams,
253253
OCRParameters ocrParams,
254254
const AreaParameters &areaParams,
@@ -279,8 +279,6 @@ void PreviewImage::CreateImage(const VideoInput &video, PreviewType type,
279279
areaParams.area.x, areaParams.area.y,
280280
areaParams.area.width, areaParams.area.height);
281281
}
282-
const auto patternImageData =
283-
CreatePatternData(patternMatchParams.image);
284282
// Will emit status label update
285283
MarkMatch(screenshot.image, patternMatchParams,
286284
patternImageData, objDetectParams, ocrParams,
@@ -299,7 +297,7 @@ void PreviewImage::MarkMatch(QImage &screenshot,
299297
VideoCondition condition)
300298
{
301299
if (condition == VideoCondition::PATTERN) {
302-
cv::UMat result;
300+
cv::Mat result;
303301
MatchPattern(screenshot, patternImageData,
304302
patternMatchParams.threshold, result,
305303
patternMatchParams.useAlphaAsMask,

src/macro-external/video/preview-dialog.hpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ class PreviewImage : public QObject {
2525

2626
public slots:
2727
void CreateImage(const VideoInput &, PreviewType,
28-
const PatternMatchParameters &, ObjDetectParameters,
28+
const PatternMatchParameters &,
29+
const PatternImageData &, ObjDetectParameters,
2930
OCRParameters, const AreaParameters &, VideoCondition);
3031
signals:
3132
void ImageReady(const QPixmap &);
@@ -63,8 +64,9 @@ private slots:
6364
signals:
6465
void SelectionAreaChanged(QRect area);
6566
void NeedImage(const VideoInput &, PreviewType,
66-
const PatternMatchParameters &, ObjDetectParameters,
67-
OCRParameters, const AreaParameters &, VideoCondition);
67+
const PatternMatchParameters &, const PatternImageData &,
68+
ObjDetectParameters, OCRParameters,
69+
const AreaParameters &, VideoCondition);
6870

6971
private:
7072
void Start();
@@ -76,6 +78,7 @@ private slots:
7678

7779
VideoInput _video;
7880
PatternMatchParameters _patternMatchParams;
81+
PatternImageData _patternImageData;
7982
ObjDetectParameters _objDetectParams;
8083
OCRParameters _ocrParams;
8184
AreaParameters _areaParams;

0 commit comments

Comments
 (0)