Detektering og klassificering af kimplanter ved brug af computer vision
Detektering og klassificering af kimplanter ved brug af computer vision
Detektering og klassificering af kimplanter ved brug af computer vision
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
18 Appendiks 18.9 Implementering<br />
…<br />
for(int y = 0; y < height; y++)<br />
{<br />
for(int x = 0; x < width; x++)<br />
{<br />
if(ppTempSource1GrayScalePointer[y][x]!=<br />
ppTempSource2GrayScalePointer[y][x])<br />
{<br />
ppTempDestGrayScalePointer[y][x] = 255;<br />
numberOfWhitePixels++;<br />
}<br />
}<br />
}<br />
…<br />
Derefter beregnes massemidtpunktet for de små arealer som er opstået. Til dette formål anvendes<br />
Utilities-klassens calculateCenterOfMass(). Bagefter tilføjes koordinater for punktet i seedobjektet:<br />
…<br />
CenterOfMass centerOfMassCoordinates;<br />
Utilities utilities;<br />
centerOfMassCoordinates = utilities.calculateCenterOfMass(destination, numberOfWhitePixels);<br />
pSeed[count].centerTopX = int(centerOfMassCoordinates.xCoordinate) + pSeed[count].boundsXMin;<br />
pSeed[count].centerTopY = int(centerOfMassCoordinates.yCoordinate) + pSeed[count].boundsYMin;<br />
pSeed[count].TopBottomDetection = true;<br />
…<br />
18.9.7.3 findTop()<br />
I denne funktion implementeres beregningen <strong>af</strong> vinklen mellem den linie, der går igennem de to<br />
massemidtpunkter <strong>og</strong> det vandrette plan. De to massemidtpunkter er fra henholdsvis<br />
ellipseapproksimationen <strong>og</strong> subtract()-funktionen. Som det første beregnes sidelængderne i<br />
trekanten a, b <strong>og</strong> c. Derefter beregnes vinklen. Herefter følger de to tjek der <strong>af</strong>gør om topmassemidtpunktet<br />
ligger på henholdsvis den ene eller den anden side <strong>af</strong> lilleaksen. Til sidst tilføjes<br />
det i hvilken ende toppen er beregnet til at ligge, i seed-objektet:<br />
…<br />
b = float(pSeed[count].centerTopX - pSeed[count].centerOfMassX);<br />
a = float(pSeed[count].centerTopY - pSeed[count].centerOfMassY);<br />
c = sqrt(pow(a,2)+pow(b,2));<br />
angle = acos(b/c);<br />
if(a pSeed[count].thetaMinorAxis && pSeed[count].thetaCenterTop <<br />
pSeed[count].thetaMinorAxis + M_PI)<br />
{<br />
pSeed[count].thetaTop += float(M_PI);<br />
}<br />
}<br />
else<br />
{<br />
if(pSeed[count].thetaCenterTop > pSeed[count].thetaMinorAxis || pSeed[count].thetaCenterTop <<br />
pSeed[count].thetaMinorAxis - M_PI)<br />
{<br />
pSeed[count].thetaTop += float(M_PI);<br />
}<br />
}<br />
…<br />
Side 115 <strong>af</strong> 131