Point Cloud

This commit is contained in:
Andrey Tkachenko 2014-07-23 20:50:12 +04:00
parent eefc851af5
commit 8bfc0687d8
15 changed files with 130 additions and 41 deletions

View File

@ -23,7 +23,8 @@ SOURCES += main.cpp \
svcurve.cpp \
svsimplepoint.cpp \
svfigure.cpp \
svobject.cpp
svobject.cpp \
svpointcloud.cpp
HEADERS += \
svimage.h \
@ -37,7 +38,9 @@ HEADERS += \
svcurve.h \
svsimplepoint.h \
svfigure.h \
svobject.h
svobject.h \
svpointcloud.h \
svdefs.h
RESOURCES += \
resource.qrc

View File

@ -15,7 +15,7 @@ int main(int argc, char *argv[])
QQmlApplicationEngine engine;
SvImageProvider imageProvider;
QImage imgLeft("../CSV/img/left1.png");
QImage imgLeft("../CSV/img/right9.png");
QImage imgRight("../CSV/img/right1.png");
QImage imgStereo(imgLeft.width(), imgLeft.height(), QImage::Format_RGB32);

View File

@ -2,19 +2,18 @@
#define SVABSTRACTKERNEL_H
#include "svimage.h"
#include "svpointcloud.h"
class SvAbstractKernel
{
protected:
SvImage* m_left;
SvImage* m_right;
SvImage* m_result;
SvImage* m_image;
SvPointCloud* m_pointCloud;
public:
void setLeftImage(SvImage* image) {m_left = image;}
void setRightImage(SvImage* image) {m_right = image;}
void setResultImage(SvImage* image) {m_result = image;}
void setImage(SvImage* image) {m_image = image;}
void setPointCloud(SvPointCloud* pointCloud) {m_pointCloud = pointCloud;}
virtual void exec(int line) = 0;
virtual ~SvAbstractKernel() {}
};

View File

@ -1,7 +1,11 @@
#ifndef SVCURVE_H
#define SVCURVE_H
#include <QColor>
#include "svdefs.h"
#include "svpoint.h"
#include "svsimplepoint.h"
class SvPoint;
@ -11,6 +15,9 @@ protected:
SvPoint *m_ends;
SvPoint *m_points;
SvSimplePoint *m_keyPoints;
QColor m_leftColor;
QColor m_rightColor;
public:
SvCurve();

12
svdefs.h Normal file
View File

@ -0,0 +1,12 @@
#ifndef SVDEFS_H
#define SVDEFS_H
#include <QDebug>
typedef unsigned int SvFrameId;
#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))
#define min(a,b,c) (a < b ? (a < c ? a : c) : (b < c ? b : c))
#endif // SVDEFS_H

View File

@ -2,8 +2,8 @@
#define SVIMAGE_H
#include <QImage>
#include <QRgb>
#include <QColor>
#include <QRgb>
class SvImage
{

View File

@ -23,7 +23,7 @@ int SvKernelV2::rgbDiff(QRgb left, QRgb right)
int minDiff= leftDiff < rightDiff ? rightDiff : leftDiff;
int diff = cLeft.value() - cRight.value();
int diff = qGray(left) - qGray(right);
int hsvDiff = minDiff > 70 ? abs(cLeft.hsvHue() - cRight.hsvHue()) : 0;
if (hsvDiff > 180) {
hsvDiff = 360 - hsvDiff;
@ -32,10 +32,10 @@ int SvKernelV2::rgbDiff(QRgb left, QRgb right)
int dsign = sign(diff);
dsign = dsign == 0 ? 1 : dsign;
return /*dsign * ((rightDiff - leftDiff)>>2) + */diff /*+ (hsvDiff > 5 ? dsign * 10 : 0)*/;
return dsign * (abs(rightDiff - leftDiff)>>2) + diff /*+ (hsvDiff > 5 ? dsign * 10 : 0)*/;
}
void SvKernelV2::exec(int line)
void SvKernelV2::exec(SvImage *image, int line)
{
QRgb vtop, top, right, bottom, vbottom, _xy, xy;
@ -44,7 +44,7 @@ void SvKernelV2::exec(int line)
int value;
for (int x = 0; x < m_result->getWidth(); x++) {
for (int x = 0; x < image->getWidth(); x++) {
value = 0;
vtop = m_left->getPixelRGB(x - 1, line - 3);
@ -65,6 +65,7 @@ void SvKernelV2::exec(int line)
if (dX == _dX) {
if (dX > dX_ && _dX > __dX ||
dX < dX_ && _dX < __dX) {
value += abs(dX);
}
} else {
@ -87,6 +88,7 @@ void SvKernelV2::exec(int line)
}
if (value > 0) {
m_pointCloud->addPoint();
m_result->putGrayPixel(x - 1, line - 1, value);
}

View File

@ -1,18 +1,15 @@
#ifndef SVKERNELV2_H
#define SVKERNELV2_H
#include "svdefs.h"
#include "svabstractkernel.h"
#include <QDebug>
#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))
#define min(a,b,c) (a < b ? (a < c ? a : c) : (b < c ? b : c))
class SvKernelV2: public SvAbstractKernel
{
public:
SvKernelV2();
virtual ~SvKernelV2();
void exec(int line) override;
void exec(SvImage *image, int line) override;
int rgbDiff(QRgb left, QRgb right);
};

View File

@ -2,7 +2,7 @@
#define SVPOINT_H
#include "svsimplepoint.h"
#include "svcurve.h"
#include "svdefs.h"
class SvCurve;

10
svpointcloud.cpp Normal file
View File

@ -0,0 +1,10 @@
#include "svpointcloud.h"
SvPointCloud::SvPointCloud()
{
}
void SvPointCloud::addPoint(SvFrameId frame, SvPoint point)
{
}

15
svpointcloud.h Normal file
View File

@ -0,0 +1,15 @@
#ifndef SVPOINTCLOUD_H
#define SVPOINTCLOUD_H
#include "svdefs.h"
#include "svpoint.h"
class SvPointCloud
{
public:
SvPointCloud();
void addPoint(SvFrameId frame, SvPoint point);
};
#endif // SVPOINTCLOUD_H

View File

@ -6,7 +6,7 @@ SvProcessor::SvProcessor(QObject *parent):
}
SvProcessor::SvProcessor(SvImage* left, SvImage* right, SvImage* result, int numberOfWorkers, int version)
SvProcessor::SvProcessor(SvPointCloud* pointCloud, int numberOfWorkers, int version)
{
unsigned int i;
@ -16,10 +16,7 @@ SvProcessor::SvProcessor(SvImage* left, SvImage* right, SvImage* result, int num
m_kernel = new SvKernelV2();
}
m_kernel->setLeftImage(left);
m_kernel->setRightImage(right);
m_kernel->setResultImage(result);
m_kernel->setPointCloud(pointCloud);
m_numberOfWorkers = numberOfWorkers;
m_workers = new SvWorker[m_numberOfWorkers];
m_threads = new QThread[m_numberOfWorkers];
@ -32,17 +29,40 @@ SvProcessor::SvProcessor(SvImage* left, SvImage* right, SvImage* result, int num
connect(&m_threads[i], &QThread::started, &m_workers[i], &SvWorker::start);
connect(&m_workers[i], &SvWorker::finished, this, &SvProcessor::workerFinished);
}
for (i = 0; i < result->getHeight(); i++) {
m_workers[i % m_numberOfWorkers].addTask(i);
}
}
SvProcessor::~SvProcessor()
{
delete m_kernel;
delete[] m_workers;
}
void SvProcessor::enqueueImage(SvFrameId frame, SvImage *image)
{
SvProcessorTask *task;
for (int i = 0; i < image->getHeight(); i++) {
task = new SvProcessorTask;
task->image = image;
task->line = i;
m_queue.enqueue(task);
}
}
SvProcessorTask SvProcessor::nextTask()
{
SvProcessorTask task;
SvProcessorTask *taskPtr;
m_nextTaskMutex.lock();
taskPtr = m_queue.dequeue();
m_nextTaskMutex.unlock();
task = *taskPtr;
delete taskPtr;
return task;
}
void SvProcessor::workerFinished(int workerId)
{
qDebug() << "worker " << workerId << " finished";

View File

@ -3,15 +3,25 @@
#include <time.h>
#include<QObject>
#include<QThread>
#include<QDebug>
#include <QObject>
#include <QThread>
#include <QDebug>
#include <QQueue>
#include <QMutex>
#include "svimage.h"
#include "svworker.h"
#include "svabstractkernel.h"
#include "svkernelv1.h"
#include "svkernelv2.h"
#include "svpointcloud.h"
typedef struct {
SvImage *image;
int line;
} SvProcessorTask;
class SvProcessor: public QObject
{
@ -24,12 +34,18 @@ protected:
unsigned int m_numberOfWorkers;
unsigned int m_workersFinished;
unsigned int m_startTime;
QQueue<SvProcessorTask*> m_queue;
QMutex m_nextTaskMutex;
public:
explicit SvProcessor(QObject *parent = 0);
SvProcessor(SvImage *left, SvImage *right, SvImage *result, int numberOfWorkers = 1, int version = 1);
SvProcessor(SvPointCloud *pointCloud, int numberOfWorkers = 1, int version = 1);
~SvProcessor();
void execute();
void enqueueImage(SvFrameId frame, SvImage *image);
protected:
SvProcessorTask nextTask();
protected slots:
void workerFinished(int workerId);

View File

@ -6,8 +6,9 @@ SvWorker::SvWorker(QObject *parent) :
}
SvWorker::SvWorker(SvAbstractKernel* kernel)
SvWorker::SvWorker(SvProcessorTask *processor, SvAbstractKernel *kernel)
{
m_processor = processor;
m_kernel = kernel;
}
@ -18,8 +19,16 @@ void SvWorker::stop()
void SvWorker::start()
{
for (int i: m_tasks) {
m_kernel->exec(i);
SvProcessorTask task;
while(true) {
try {
task = m_processor->nextTask();
} catch (SvNoMoreTasks ex) {
break;
}
m_kernel->exec(task.image, task.line);
}
emit finished(m_id);

View File

@ -5,6 +5,7 @@
#include <QList>
#include "svabstractkernel.h"
#include "svprocessor.h"
#include "svimage.h"
class SvWorker : public QObject
@ -13,15 +14,14 @@ class SvWorker : public QObject
protected:
int m_id;
SvAbstractKernel* m_kernel;
QList<unsigned int> m_tasks;
SvAbstractKernel *m_kernel;
SvProcessor *m_processor;
public:
explicit SvWorker(QObject *parent = 0);
SvWorker(SvAbstractKernel* kernel);
SvWorker(SvProcessorTask *processor, SvAbstractKernel *kernel);
void setId(int id) {m_id = id;}
void addTask(int line) {m_tasks << line;}
void setKernel(SvAbstractKernel* kernel) {m_kernel = kernel;}
signals:
@ -30,7 +30,6 @@ signals:
public slots:
void stop();
void start();
};
#endif // SVWORKER_H