From a7c102324cf01aea59d50c93cb979cffd37b5857 Mon Sep 17 00:00:00 2001 From: Andrey Tkachenko Date: Fri, 25 Jul 2014 11:32:00 +0400 Subject: [PATCH] OpenGL PointCloudViewer added --- CSV.pro | 15 ++--- Main.qml | 25 ++------ main.cpp | 15 +++-- svabstractkernel.h | 21 ------- svdefs.h | 12 ++++ svfigure.h | 2 +- svkernelv2.cpp => svkernel.cpp | 26 ++++---- svkernel.h | 17 ++++++ svkernelv1.cpp | 105 --------------------------------- svkernelv1.h | 23 -------- svkernelv2.h | 16 ----- svobject.h | 3 + svpointcloud.cpp | 21 ++++++- svpointcloud.h | 19 +++++- svpointcloudrenderer.cpp | 61 +++++++++++++++++++ svpointcloudrenderer.h | 24 ++++++++ svpointcloudviewer.cpp | 37 ++++++++++++ svpointcloudviewer.h | 44 ++++++++++++++ svprocessor.cpp | 31 +++++----- svprocessor.h | 36 ++++++----- svworker.cpp | 4 +- svworker.h | 14 +++-- 22 files changed, 313 insertions(+), 258 deletions(-) delete mode 100644 svabstractkernel.h rename svkernelv2.cpp => svkernel.cpp (76%) create mode 100644 svkernel.h delete mode 100644 svkernelv1.cpp delete mode 100644 svkernelv1.h delete mode 100644 svkernelv2.h create mode 100644 svpointcloudrenderer.cpp create mode 100644 svpointcloudrenderer.h create mode 100644 svpointcloudviewer.cpp create mode 100644 svpointcloudviewer.h diff --git a/CSV.pro b/CSV.pro index 73232b3..dce0fb8 100644 --- a/CSV.pro +++ b/CSV.pro @@ -16,23 +16,21 @@ SOURCES += main.cpp \ svimage.cpp \ svworker.cpp \ svprocessor.cpp \ - svkernelv1.cpp \ - svkernelv2.cpp \ svimageprovider.cpp \ svpoint.cpp \ svcurve.cpp \ svsimplepoint.cpp \ svfigure.cpp \ svobject.cpp \ - svpointcloud.cpp + svpointcloud.cpp \ + svkernel.cpp \ + svpointcloudviewer.cpp \ + svpointcloudrenderer.cpp HEADERS += \ svimage.h \ svworker.h \ svprocessor.h \ - svabstractkernel.h \ - svkernelv1.h \ - svkernelv2.h \ svimageprovider.h \ svpoint.h \ svcurve.h \ @@ -40,7 +38,10 @@ HEADERS += \ svfigure.h \ svobject.h \ svpointcloud.h \ - svdefs.h + svdefs.h \ + svkernel.h \ + svpointcloudviewer.h \ + svpointcloudrenderer.h RESOURCES += \ resource.qrc diff --git a/Main.qml b/Main.qml index 888f37c..70a2216 100644 --- a/Main.qml +++ b/Main.qml @@ -1,6 +1,7 @@ import QtQuick 2.2 import QtQuick.Window 2.1 import QtQuick.Controls 1.1 +import SvPCV 1.0 ApplicationWindow { id: mainWindow @@ -147,29 +148,11 @@ ApplicationWindow { anchors.fill: parent Tab { id: imageView - title: "Image View" + title: "PointCloud View" Item { - Flickable { + anchors.fill: parent + SvPointCloudViewer { anchors.fill: parent - contentWidth: image.width - contentHeight: image.height - interactive: true - anchors.margins: 2 - clip: true - - Item { - Image { - id: image - source: "" - smooth: false - } - Connections { - target: processor - onFinished: { - image.source = "image://images/result"; - } - } - } } } } diff --git a/main.cpp b/main.cpp index 822e455..720fb1b 100644 --- a/main.cpp +++ b/main.cpp @@ -7,33 +7,38 @@ #include "svimage.h" #include "svprocessor.h" #include "svimageprovider.h" +#include "svpointcloudviewer.h" int main(int argc, char *argv[]) { QGuiApplication a(argc, argv); + qmlRegisterType("SvPCV", 1, 0, "SvPointCloudViewer"); + QQmlApplicationEngine engine; SvImageProvider imageProvider; QImage imgLeft("../CSV/img/right9.png"); QImage imgRight("../CSV/img/right1.png"); - QImage imgStereo(imgLeft.width(), imgLeft.height(), QImage::Format_RGB32); SvImage left(imgLeft); SvImage right(imgRight); - SvImage stereo(imgStereo); - SvProcessor proc(&left, &right, &stereo, 4, 2); + SvPointCloud pointCloud(imgLeft.width(), imgLeft.height()); + + SvProcessor proc(4); + + proc.enqueueImage(&pointCloud, &left); imageProvider.addImage("left", &left); imageProvider.addImage("right", &right); - imageProvider.addImage("result", &stereo); engine.addImageProvider("images", &imageProvider); - engine.load(QUrl(QStringLiteral("qrc:///Main.qml"))); engine.rootContext()->setContextProperty("processor", &proc); + engine.load(QUrl(QStringLiteral("qrc:///Main.qml"))); proc.start(); + return a.exec(); } diff --git a/svabstractkernel.h b/svabstractkernel.h deleted file mode 100644 index 93cdd7a..0000000 --- a/svabstractkernel.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef SVABSTRACTKERNEL_H -#define SVABSTRACTKERNEL_H - -#include "svimage.h" -#include "svpointcloud.h" - -class SvAbstractKernel -{ - -protected: - SvImage* m_image; - SvPointCloud* m_pointCloud; - -public: - void setImage(SvImage* image) {m_image = image;} - void setPointCloud(SvPointCloud* pointCloud) {m_pointCloud = pointCloud;} - virtual void exec(int line) = 0; - virtual ~SvAbstractKernel() {} -}; - -#endif // SVABSTRACTKERNEL_H diff --git a/svdefs.h b/svdefs.h index ed4b8d0..ebd6d1a 100644 --- a/svdefs.h +++ b/svdefs.h @@ -4,6 +4,18 @@ #include typedef unsigned int SvFrameId; +typedef unsigned int uint; + +#include "svpointcloud.h" +#include "svimage.h" + +class SvPointCloud; + +typedef struct { + SvPointCloud *pointCloud; + SvImage *image; + int line; +} SvProcessorTask; #define sign(a) (a == 0 ? 0 : (a > 0 ? 1 : -1)) #define max(a,b,c) (a > b ? (a > c ? a : c) : (b > c ? b : c)) diff --git a/svfigure.h b/svfigure.h index 3c9c614..06a9936 100644 --- a/svfigure.h +++ b/svfigure.h @@ -7,7 +7,7 @@ class SvFigure { protected: - SvPoint ends[2]; + SvPoint *ends; public: diff --git a/svkernelv2.cpp b/svkernel.cpp similarity index 76% rename from svkernelv2.cpp rename to svkernel.cpp index be2a98f..5dad4cb 100644 --- a/svkernelv2.cpp +++ b/svkernel.cpp @@ -1,16 +1,16 @@ -#include "svkernelv2.h" +#include "svkernel.h" -SvKernelV2::SvKernelV2() +SvKernel::SvKernel() { } -SvKernelV2::~SvKernelV2() +SvKernel::~SvKernel() { } -int SvKernelV2::rgbDiff(QRgb left, QRgb right) +int SvKernel::rgbDiff(QRgb left, QRgb right) { QColor cLeft(left); QColor cRight(right); @@ -35,7 +35,7 @@ int SvKernelV2::rgbDiff(QRgb left, QRgb right) return dsign * (abs(rightDiff - leftDiff)>>2) + diff /*+ (hsvDiff > 5 ? dsign * 10 : 0)*/; } -void SvKernelV2::exec(SvImage *image, int line) +void SvKernel::exec(SvPointCloud *pcl, SvImage *image, int line) { QRgb vtop, top, right, bottom, vbottom, _xy, xy; @@ -47,12 +47,12 @@ void SvKernelV2::exec(SvImage *image, int line) for (int x = 0; x < image->getWidth(); x++) { value = 0; - vtop = m_left->getPixelRGB(x - 1, line - 3); - top = m_left->getPixelRGB(x - 1, line - 2); - right = m_left->getPixelRGB(x, line - 1); - bottom = m_left->getPixelRGB(x - 1, line); - vbottom = m_left->getPixelRGB(x - 1, line + 1); - xy = m_left->getPixelRGB(x - 1, line - 1); + vtop = image->getPixelRGB(x - 1, line - 3); + top = image->getPixelRGB(x - 1, line - 2); + right = image->getPixelRGB(x, line - 1); + bottom = image->getPixelRGB(x - 1, line); + vbottom = image->getPixelRGB(x - 1, line + 1); + xy = image->getPixelRGB(x - 1, line - 1); dX_ = rgbDiff(_xy, right); dY_ = rgbDiff(vtop, top); @@ -88,8 +88,8 @@ void SvKernelV2::exec(SvImage *image, int line) } if (value > 0) { - m_pointCloud->addPoint(); - m_result->putGrayPixel(x - 1, line - 1, value); + + //m_result->putGrayPixel(x - 1, line - 1, value); } __dX = _dX; diff --git a/svkernel.h b/svkernel.h new file mode 100644 index 0000000..2bdf616 --- /dev/null +++ b/svkernel.h @@ -0,0 +1,17 @@ +#ifndef SVKERNELV2_H +#define SVKERNELV2_H + +#include "svdefs.h" +#include "svimage.h" +#include "svpointcloud.h" + +class SvKernel +{ +public: + SvKernel(); + virtual ~SvKernel(); + void exec(SvPointCloud *pcl, SvImage *image, int line); + int rgbDiff(QRgb left, QRgb right); +}; + +#endif // SVKERNELV2_H diff --git a/svkernelv1.cpp b/svkernelv1.cpp deleted file mode 100644 index 4e74723..0000000 --- a/svkernelv1.cpp +++ /dev/null @@ -1,105 +0,0 @@ -#include "svkernelv1.h" - -SvKernelV1::SvKernelV1() -{ - -} - -SvKernelV1::~SvKernelV1() -{ - -} - - -int SvKernelV1::getPixelColor(int cursor) -{ - if (cursor == 0) { - return 0; - } - - return ((10 * m_left->getWidth()) / (2.0 * 0.9 * cursor )); -} - -int SvKernelV1::diff(int lx, int ly, int rx, int ry) -{ - int Red, Green, Blue, color; - - int Lvalue = m_left->getPixelValue(lx, ly); - int Rvalue = m_right->getPixelValue(rx, ry); - - int dLvalue = m_left->getPixelValue(rx - 1, ry) - Lvalue; - int dRvalue = m_right->getPixelValue(rx - 1, ry) - Rvalue; - - int dLsign = dLvalue >= 0 ? 1 : -1; - int dRsign = dRvalue >= 0 ? 1 : -1; - - Red = abs(m_left->getPixel(lx, ly, 0) - m_right->getPixel(rx, ry, 0)); - Green = abs(m_left->getPixel(lx, ly, 1) - m_right->getPixel(rx, ry, 1)); - Blue = abs(m_left->getPixel(lx, ly, 2) - m_right->getPixel(rx, ry, 2)); - color = abs(Green - Red) + abs(Blue - Green); - - return ((Green + Red + Blue) + - color << 2) + (dLsign == dRsign ? 0 : 100); -} - -int SvKernelV1::match(int x, int y, int j) -{ - int error = 0; - int ms = 5; - int c = diff(x, y, x + j, y), - l = 0, r = 0, t = 0, b = 0; - - error = c; - - for (int i = 1; i <= ms; i++) { - l += diff(x - i, y, x + j - i, y); - r += diff(x + i, y, x + j + i, y); - t += diff(x, y - i, x + j, y - i); - b += diff(x, y + i, x + j, y + i); - } - - error += l > r ? r : l; - error += t > b ? b : t; - //error += l + r + b + t; - - return error; -} - -void SvKernelV1::exec(int line) -{ - unsigned int x; - int cursor, closest, tmp; - int minErrorValue, tmpSmoothed, matched; - int dist; - - cursor = 0; - - for (x = 0; x < m_result->getWidth(); x+=1) { - closest = -1; minErrorValue = -1;matched=0; - minErrorValue=-1; - - for (int i = 1; i < m_windowSize; i++) { - dist = (abs(cursor - i)); - - tmp = match(x, line, i); - tmpSmoothed = tmp; - - if (tmpSmoothed < minErrorValue || minErrorValue == -1) { - minErrorValue = tmpSmoothed; - closest = i; - matched = 1; - } else if (tmpSmoothed == minErrorValue) { - if (abs(cursor - i) < abs(cursor - closest)) { - closest = i; - matched++; - } - } - } - - if (matched == 1) { - cursor = closest; - } - - m_result->putGrayPixel(x/* + cursor*/, line, getPixelColor(cursor)); - } -} diff --git a/svkernelv1.h b/svkernelv1.h deleted file mode 100644 index 64a5205..0000000 --- a/svkernelv1.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef SVKERNELV1_H -#define SVKERNELV1_H - -#include "svabstractkernel.h" - -class SvKernelV1: public SvAbstractKernel -{ - -protected: - int m_windowSize = 160; - -public: - void exec(int line) override; - SvKernelV1(); - virtual ~SvKernelV1(); - -protected: - int getPixelColor(int cursor); - int diff(int lx, int ly, int rx, int ry); - int match(int x, int y, int i); -}; - -#endif // SVKERNELV1_H diff --git a/svkernelv2.h b/svkernelv2.h deleted file mode 100644 index 8393ad8..0000000 --- a/svkernelv2.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef SVKERNELV2_H -#define SVKERNELV2_H - -#include "svdefs.h" -#include "svabstractkernel.h" - -class SvKernelV2: public SvAbstractKernel -{ -public: - SvKernelV2(); - virtual ~SvKernelV2(); - void exec(SvImage *image, int line) override; - int rgbDiff(QRgb left, QRgb right); -}; - -#endif // SVKERNELV2_H diff --git a/svobject.h b/svobject.h index c5df457..071ce9d 100644 --- a/svobject.h +++ b/svobject.h @@ -3,6 +3,9 @@ #include "svfigure.h" +class SvFigure; + + class SvObject { protected: diff --git a/svpointcloud.cpp b/svpointcloud.cpp index 449cea1..4b6e0ca 100644 --- a/svpointcloud.cpp +++ b/svpointcloud.cpp @@ -1,10 +1,27 @@ #include "svpointcloud.h" -SvPointCloud::SvPointCloud() +SvPointCloud::SvPointCloud(uint width, uint height) { + m_pointFiledHeight = height; + m_pointFiledWidth = width; + + m_pointField = new SvPoint* [height]; + + for (uint y = 0; y < height; y++) { + m_pointField[y] = new SvPoint[width]; + } +} + +SvPointCloud::~SvPointCloud() +{ + for (uint y = 0; y < m_pointFiledHeight; y++) { + delete[] m_pointField[y]; + } + + delete[] m_pointField; } void SvPointCloud::addPoint(SvFrameId frame, SvPoint point) { - + m_pointField[point.y()][point.x()] = point; } diff --git a/svpointcloud.h b/svpointcloud.h index a3b3e64..e17f56c 100644 --- a/svpointcloud.h +++ b/svpointcloud.h @@ -3,13 +3,30 @@ #include "svdefs.h" #include "svpoint.h" +#include "svcurve.h" +#include "svfigure.h" +#include "svobject.h" + +class SvCurve; +class SvFigure; +class SvObject; class SvPointCloud { +protected: + uint m_pointFiledHeight; + uint m_pointFiledWidth; + SvPoint** m_pointField; + QList m_curves; + QList m_figures; + QList m_objects; + public: - SvPointCloud(); + SvPointCloud(uint width, uint height); + ~SvPointCloud(); void addPoint(SvFrameId frame, SvPoint point); + }; #endif // SVPOINTCLOUD_H diff --git a/svpointcloudrenderer.cpp b/svpointcloudrenderer.cpp new file mode 100644 index 0000000..81be977 --- /dev/null +++ b/svpointcloudrenderer.cpp @@ -0,0 +1,61 @@ +#include "svpointcloudrenderer.h" + +SvPointCloudRenderer::SvPointCloudRenderer(QObject *parent) : + QObject(parent) +{ +} + +void SvPointCloudRenderer::paint() +{ + if (!m_program) { + m_program = new QOpenGLShaderProgram(); + m_program->addShaderFromSourceCode(QOpenGLShader::Vertex, + "attribute highp vec4 vertices;" + "varying highp vec2 coords;" + "void main() {" + " gl_Position = vertices;" + " coords = vertices.xy;" + "}"); + m_program->addShaderFromSourceCode(QOpenGLShader::Fragment, + "uniform lowp float t;" + "varying highp vec2 coords;" + "void main() {" + " lowp float i = 1. - (pow(abs(coords.x), 4.) + pow(abs(coords.y), 4.));" + " i = smoothstep(t - 0.8, t + 0.8, i);" + " i = floor(i * 20.) / 20.;" + " gl_FragColor = vec4(coords * .5 + .5, i, i);" + "}"); + + m_program->bindAttributeLocation("vertices", 0); + m_program->link(); + + } + + m_program->bind(); + + m_program->enableAttributeArray(0); + + float values[] = { + -1, -1, + 1, -1, + -1, 1, + 1, 1 + }; + m_program->setAttributeArray(0, GL_FLOAT, values, 2); + m_program->setUniformValue("t", (float) m_t); + + glViewport(0, 0, m_viewportSize.width(), m_viewportSize.height()); + + glDisable(GL_DEPTH_TEST); + + glClearColor(0, 0, 0, 1); + glClear(GL_COLOR_BUFFER_BIT); + + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + + m_program->disableAttributeArray(0); + m_program->release(); +} diff --git a/svpointcloudrenderer.h b/svpointcloudrenderer.h new file mode 100644 index 0000000..84bb2f3 --- /dev/null +++ b/svpointcloudrenderer.h @@ -0,0 +1,24 @@ +#ifndef SVPOINTCLOUDRENDERER_H +#define SVPOINTCLOUDRENDERER_H + +#include +#include +#include + +class SvPointCloudRenderer : public QObject +{ + Q_OBJECT +public: + explicit SvPointCloudRenderer(QObject *parent = 0); + void setViewportSize(const QSize &size) { m_viewportSize = size; } + +public slots: + void paint(); + +private: + QSize m_viewportSize; + qreal m_t; + QOpenGLShaderProgram *m_program; +}; + +#endif // SVPOINTCLOUDRENDERER_H diff --git a/svpointcloudviewer.cpp b/svpointcloudviewer.cpp new file mode 100644 index 0000000..fd31a61 --- /dev/null +++ b/svpointcloudviewer.cpp @@ -0,0 +1,37 @@ +#include "svpointcloudviewer.h" + +SvPointCloudViewer::SvPointCloudViewer(QQuickItem *parent) : + QQuickItem(parent) +{ + +} + +void SvPointCloudViewer::handleWindowChanged(QQuickWindow *win) +{ + if (win) { + connect(win, &QQuickWindow::beforeSynchronizing, + this, &SvPointCloudViewer::sync, Qt::DirectConnection); + + connect(win, &QQuickWindow::sceneGraphInvalidated, + this, &SvPointCloudViewer::cleanup, Qt::DirectConnection); + } +} + +void SvPointCloudViewer::sync() +{ + if (!m_pointCloudRenderer) { + m_pointCloudRenderer = new SvPointCloudRenderer(); + connect(window(), &QQuickWindow::beforeRendering, + m_pointCloudRenderer, &SvPointCloudRenderer::paint, Qt::DirectConnection); + } + + m_pointCloudRenderer->setViewportSize(window()->size() * window()->devicePixelRatio()); +} + +void SvPointCloudViewer::cleanup() +{ + if (m_pointCloudRenderer) { + delete m_pointCloudRenderer; + m_pointCloudRenderer = 0; + } +} diff --git a/svpointcloudviewer.h b/svpointcloudviewer.h new file mode 100644 index 0000000..380ca44 --- /dev/null +++ b/svpointcloudviewer.h @@ -0,0 +1,44 @@ +#ifndef SVPOINTCLOUDVIEWER_H +#define SVPOINTCLOUDVIEWER_H + +#include +#include + +#include "svpointcloud.h" +#include "svpointcloudrenderer.h" + +class SvPointCloudViewer : public QQuickItem +{ + Q_OBJECT + +// Q_PROPERTY(qreal cameraX READ cameraX WRITE setCameraX NOTIFY cameraXChanged) +// Q_PROPERTY(qreal cameraY READ cameraY WRITE setCameraY NOTIFY cameraYChanged) +// Q_PROPERTY(qreal cameraZ READ cameraZ WRITE setCameraZ NOTIFY cameraZChanged) + +protected: + SvPointCloud *pointCloud; + SvPointCloudRenderer *m_pointCloudRenderer; + qreal m_cameraX; + qreal m_cameraY; + qreal m_cameraZ; + +public: + explicit SvPointCloudViewer(QQuickItem *parent = 0); + +signals: + void cameraXChanged(); + void cameraYChanged(); + void cameraZChanged(); + +private slots: + void handleWindowChanged(QQuickWindow *win); + +public slots: + void sync(); + void cleanup(); + //void resetCamera(); + //void moveCamera(qreal X, qreal Y, qreal Z); + // void rotateCamera(qreal X, qreal Y, qreal Z); +}; + +#endif // SVPOINTCLOUDVIEWER_H diff --git a/svprocessor.cpp b/svprocessor.cpp index 6baaca5..bfed011 100644 --- a/svprocessor.cpp +++ b/svprocessor.cpp @@ -6,17 +6,12 @@ SvProcessor::SvProcessor(QObject *parent): } -SvProcessor::SvProcessor(SvPointCloud* pointCloud, int numberOfWorkers, int version) +SvProcessor::SvProcessor(int numberOfWorkers) { - unsigned int i; + uint i; - if (version == 1) { - m_kernel = new SvKernelV1(); - } else if (version == 2) { - m_kernel = new SvKernelV2(); - } + m_kernel = new SvKernel(); - m_kernel->setPointCloud(pointCloud); m_numberOfWorkers = numberOfWorkers; m_workers = new SvWorker[m_numberOfWorkers]; m_threads = new QThread[m_numberOfWorkers]; @@ -37,26 +32,30 @@ SvProcessor::~SvProcessor() delete[] m_workers; } -void SvProcessor::enqueueImage(SvFrameId frame, SvImage *image) +void SvProcessor::enqueueImage(SvPointCloud *pointCloud, SvImage *image) { SvProcessorTask *task; - for (int i = 0; i < image->getHeight(); i++) { + for (uint i = 0; i < image->getHeight(); i++) { task = new SvProcessorTask; task->image = image; task->line = i; - m_queue.enqueue(task); + task->pointCloud = pointCloud; + m_taskQueue.enqueue(task); } } SvProcessorTask SvProcessor::nextTask() { - SvProcessorTask task; - SvProcessorTask *taskPtr; + SvProcessorTask task, *taskPtr; + if (!m_taskQueue.size()) { + throw new SvNoMoreTasks(); + } m_nextTaskMutex.lock(); - taskPtr = m_queue.dequeue(); + taskPtr = m_taskQueue.dequeue(); m_nextTaskMutex.unlock(); + task = *taskPtr; delete taskPtr; @@ -75,13 +74,13 @@ void SvProcessor::workerFinished(int workerId) void SvProcessor::start() { - unsigned int i; + uint i; m_startTime = time(NULL); m_workersFinished = 0; for (i = 0; i < m_numberOfWorkers; i++) { - m_threads[i].start(QThread::HighestPriority); + m_threads[i].start(QThread::HighPriority); } } diff --git a/svprocessor.h b/svprocessor.h index e65eeda..115d260 100644 --- a/svprocessor.h +++ b/svprocessor.h @@ -8,43 +8,41 @@ #include #include #include +#include #include "svimage.h" #include "svworker.h" -#include "svabstractkernel.h" -#include "svkernelv1.h" -#include "svkernelv2.h" +#include "svkernel.h" #include "svpointcloud.h" -typedef struct { - SvImage *image; - int line; -} SvProcessorTask; +class SvWorker; +class SvNoMoreTasks: public QException +{ + +}; class SvProcessor: public QObject { Q_OBJECT protected: - QThread* m_threads; - SvWorker* m_workers; - SvAbstractKernel* m_kernel; - unsigned int m_numberOfWorkers; - unsigned int m_workersFinished; - unsigned int m_startTime; - QQueue m_queue; - QMutex m_nextTaskMutex; + QThread* m_threads; + SvWorker* m_workers; + SvKernel* m_kernel; + uint m_numberOfWorkers; + uint m_workersFinished; + uint m_startTime; + QQueue m_taskQueue; + QMutex m_nextTaskMutex; public: explicit SvProcessor(QObject *parent = 0); - SvProcessor(SvPointCloud *pointCloud, int numberOfWorkers = 1, int version = 1); + SvProcessor(int numberOfWorkers = 1); ~SvProcessor(); void execute(); - void enqueueImage(SvFrameId frame, SvImage *image); - -protected: + void enqueueImage(SvPointCloud *pointCloud, SvImage *image); SvProcessorTask nextTask(); protected slots: diff --git a/svworker.cpp b/svworker.cpp index 94dff88..e5bd3b3 100644 --- a/svworker.cpp +++ b/svworker.cpp @@ -6,7 +6,7 @@ SvWorker::SvWorker(QObject *parent) : } -SvWorker::SvWorker(SvProcessorTask *processor, SvAbstractKernel *kernel) +SvWorker::SvWorker(SvProcessor *processor, SvKernel *kernel) { m_processor = processor; m_kernel = kernel; @@ -28,7 +28,7 @@ void SvWorker::start() break; } - m_kernel->exec(task.image, task.line); + m_kernel->exec(task.pointCloud, task.image, task.line); } emit finished(m_id); diff --git a/svworker.h b/svworker.h index 7c710c8..afc4ec9 100644 --- a/svworker.h +++ b/svworker.h @@ -4,25 +4,27 @@ #include #include -#include "svabstractkernel.h" +#include "svkernel.h" #include "svprocessor.h" #include "svimage.h" +class SvProcessor; + class SvWorker : public QObject { Q_OBJECT protected: - int m_id; - SvAbstractKernel *m_kernel; - SvProcessor *m_processor; + int m_id; + SvKernel *m_kernel; + SvProcessor *m_processor; public: explicit SvWorker(QObject *parent = 0); - SvWorker(SvProcessorTask *processor, SvAbstractKernel *kernel); + SvWorker(SvProcessor *processor, SvKernel *kernel); void setId(int id) {m_id = id;} - void setKernel(SvAbstractKernel* kernel) {m_kernel = kernel;} + void setKernel(SvKernel* kernel) {m_kernel = kernel;} signals: void finished(int id);