81 lines
2.6 KiB
C++

#include "lfr.h"
LFR::LFR(int videoHeight, int videoWidth, int thresholdBinary, int gaussKernelSize, int thresholdCanny1, int thresholdCanny2, int apertureSizeCanny)
: iAmLooping(false), input(videoHeight, videoWidth), processing(), controlModule(), interpreter(), intersectionHandler()
{
this->iAmLooping = false;
this->thresholdBinary = thresholdBinary;
this->gaussKernelSize = gaussKernelSize;
this->thresholdCanny1 = thresholdCanny1;
this->thresholdCanny2 = thresholdCanny2;
this->apertureSizeCanny = apertureSizeCanny;
this->videoFlag = false;
this->saveOutputFlag = false;
this->outputFileName = "";
}
LFR::~LFR()
{
if(iAmLooping)
{
this->endLoop();
}
}
void LFR::loop()
{
if(this->videoFlag) {namedWindow("Display window");}
while(iAmLooping)
{
Mat originalImage = input.readWebcam();
Point roiOrigin(0, int(originalImage.rows*(7.5/12.0)));
Rect roi(roiOrigin.x, roiOrigin.y, originalImage.cols, originalImage.rows/12);
Mat processedImage = originalImage(roi);
processing.processImage(processedImage, this->thresholdBinary, this->gaussKernelSize, this->thresholdCanny1, thresholdCanny2, this->apertureSizeCanny);
FrameData data = processing.calculateLineSegments(processedImage, roi);
this->provideOutput(originalImage, data, roi);
}
if(this->videoFlag) {destroyWindow("Display window");}
input.freeWebcam();
}
void LFR::startLoop()
{
iAmLooping = true;
this->loopThread=thread(&LFR::loop, this);
}
void LFR::endLoop()
{
iAmLooping = false;
this->loopThread.join();
return;
}
void LFR::provideOutput(Mat image, const FrameData& frameData, const Rect& roi)
{
for(int i = 0; i < frameData.contours.size(); i++)
{
drawContours(image, frameData.contours, i, Scalar(0,255,255), 1, 8, noArray(), 0, Point(roi.x, roi.y));
rectangle(image, frameData.boundingBoxes[i], Scalar(0,255,0));
Rect center(Point(frameData.middlePoints[i].x-2, frameData.middlePoints[i].y-2), Point(frameData.middlePoints[i].x+2, frameData.middlePoints[i].y+2));
rectangle(image, center, Scalar(0,0,255));
Rect leftRect(Point(frameData.leftEdges[i].x-2, frameData.leftEdges[i].y-2), Point(frameData.leftEdges[i].x+2, frameData.leftEdges[i].y+2));
rectangle(image, leftRect, Scalar(0,0,255));
}
if(this->videoFlag)
{
imshow("Display window", image);
char c = (char)waitKey(25);
}
if (this->saveOutputFlag && !(this->outputFileName.empty()))
{
imwrite(this->outputFileName, image);
}
}