New angle calculation concept
This commit is contained in:
parent
d7fc54cfd0
commit
be7b35f668
@ -82,58 +82,68 @@ void Processing::calcAngles(FrameData &data, int imageColums, int imageRows, boo
|
||||
|
||||
if(data.contours.size() > 0)
|
||||
{
|
||||
int angle = 0;
|
||||
int index;
|
||||
if(turnLeft){
|
||||
// get the most left/right contour
|
||||
|
||||
int leftmostEdge = imageColums;
|
||||
|
||||
for (int i = 0; i < data.leftEdges.size(); i++)
|
||||
{
|
||||
int edge = data.leftEdges[i].x;
|
||||
|
||||
if (edge <= leftmostEdge)
|
||||
{
|
||||
leftmostEdge = edge;
|
||||
index = i;
|
||||
}
|
||||
}
|
||||
}else
|
||||
{
|
||||
int rightmostEdge = 0;
|
||||
|
||||
for (int i = 0; i < data.leftEdges.size(); i++)
|
||||
{
|
||||
int edge = data.leftEdges[i].x;
|
||||
|
||||
if (edge >= rightmostEdge)
|
||||
if (edge <= leftmostEdge && turnLeft)
|
||||
{
|
||||
leftmostEdge = edge;
|
||||
index = i;
|
||||
}
|
||||
else if(edge >= rightmostEdge && !turnLeft)
|
||||
{
|
||||
rightmostEdge = edge;
|
||||
index = i;
|
||||
}
|
||||
}
|
||||
}
|
||||
// Find the Top-Left and Buttom-Left Point of the Contour
|
||||
|
||||
// Find the Top-Left and Bottom-Left Point of the Contour
|
||||
|
||||
std::vector<cv::Point> leftMostContour = data.contours[index];
|
||||
int xleftButtom = imageColums;
|
||||
|
||||
/*
|
||||
Not going to dive into that part to fix it.
|
||||
Trying to use centroid instead.
|
||||
int xleftBottom = imageColums;
|
||||
int xleftTop = imageColums;
|
||||
int yButtom = data.boundingBoxes[index].y;
|
||||
int yBottom = data.boundingBoxes[index].y;
|
||||
int yTop = data.boundingBoxes[index].height;
|
||||
|
||||
for (int i = 0; i < leftMostContour.size(); i++){
|
||||
if(leftMostContour[i].y == 0 && leftMostContour[i].x < xleftButtom)
|
||||
for (int i = 0; i < leftMostContour.size(); i++)
|
||||
{
|
||||
if(leftMostContour[i].y == 0 && leftMostContour[i].x < xleftBottom)
|
||||
{
|
||||
xleftBottom = leftMostContour[i].x;
|
||||
}
|
||||
else if(leftMostContour[i].y > yTop -4 && leftMostContour[i].x < xleftTop)
|
||||
{
|
||||
xleftButtom = leftMostContour[i].x;
|
||||
}else if(leftMostContour[i].y > yTop -4 && leftMostContour[i].x < xleftTop){
|
||||
xleftTop = leftMostContour[i].x;
|
||||
}
|
||||
}
|
||||
|
||||
// calculate angle
|
||||
int deltaX = abs(xleftButtom - xleftTop);
|
||||
int deltaX = abs(xleftBottom - xleftTop);
|
||||
int deltaY = yTop;
|
||||
angle = Calcs::calcAngle(deltaX, deltaY);
|
||||
*/
|
||||
|
||||
//Get the contours center using moments:
|
||||
cv::Moments moments=cv::moments(leftMostContour);
|
||||
LFRPoint contourCenter(moments.m10/moments.m00, moments.m01/moments.m00);
|
||||
LFRPoint imageCenter(double(imageColums)/2.0, double(imageRows)/2.0);
|
||||
LFRPoint focusPoint(imageCenter.x, imageCenter.y+1000.0);
|
||||
|
||||
LFRVector a(imageCenter-focusPoint);
|
||||
LFRVector b(contourCenter-focusPoint);
|
||||
|
||||
double angle = a.angle(b);
|
||||
|
||||
//Write to Data
|
||||
data.angle = angle;
|
||||
|
@ -139,12 +139,13 @@ cv::Mat LFR::provideOutput(Mat originalImage, Mat processedImage, const FrameDat
|
||||
{
|
||||
//Draw the Arrow for the check of the angle
|
||||
int length = 100;
|
||||
Point P1 = frameData.middlePoints[frameData.index];
|
||||
Point P2;
|
||||
|
||||
P2.x = (int)round(P1.x + length * cos(frameData.angle * CV_PI / 180.0));
|
||||
P2.y = (int)round(P1.y + length * sin(frameData.angle * CV_PI / 180.0));
|
||||
cv::arrowedLine(originalImage, P1, P2, Scalar(0,0,255), 2, 8);
|
||||
Point contourCenter = frameData.middlePoints[frameData.index];
|
||||
Point imageCenter = Point(originalImage.size().width/2.0, originalImage.size().height/2.0);
|
||||
Point focalPoint = Point(imageCenter.x, imageCenter.y+1000.0);
|
||||
|
||||
cv::arrowedLine(originalImage, focalPoint, contourCenter, Scalar(0,0,255), 2, 8);
|
||||
cv::arrowedLine(originalImage, focalPoint, imageCenter, Scalar(0,0,255), 2, 8);
|
||||
}
|
||||
return originalImage;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user