📄 queuearea.c
字号:
}
else
{
pLine->pt2.y = iIsUp == 1 ? pLine->pt2.y + iDirtH : pLine->pt2.y - iDirtH ;
}
dirtX = pLine->pt1.x > pLine->pt2.x ? pLine->pt1.x - pLine->pt2.x : pLine->pt2.x - pLine->pt1.x;
dirtY = pLine->pt1.x > pLine->pt2.x ? pLine->pt1.y - pLine->pt2.y : pLine->pt2.y - pLine->pt1.y;
slope = - dirtY / dirtX;
pLine->slope = slope;
pNext = pTmpLine->next;
pTmpLine->prev->next = pNext;
if(pNext)
{
pNext->prev = pTmpLine->prev;
}
pTmpLine->prev = pTmpLine->next = NULL;
cmReleaseCmLines(&pTmpLine);
pTmpLine = pNext;
pNext = NULL;
continue;
}
}
}
pTmpLine = pTmpLine->next;
}
pLine = pLine->next;
}
iRepTimes++;
}//while(iRepTimes < 3)--End
pLine = pHead->next;
pHead->next = NULL;
if(pLine)
{
pLine->prev = NULL;
}
cmReleaseCmLines(&pHead);
return pLine;
}
/**
* @fn cmClassifyLinesIntoRows
*
* @brief
* 揈梫丗摨偠孹幬搙傪帩偭偰偄傞捈慄傪堦楍偲偡傞丅
*
* @param[in] pFirstLine
* @param[in] pMode
* @param[in] fSlopeErr
* @param[in] fDistErr
*
* @return
*/
void cmClassifyLinesIntoRows(CmLine *pFirstLine, CmQueueAreaModel *pMode, float fSlopeErr, float fDistErr)
{
int iLineCntOfRow = 0, i , j, k;
int iArr[4];
CmLine *pHead = NULL, *pLine = NULL, *pNext = NULL, *pTemp = NULL;
CmLine lineTemp;
CvPoint ptTemp;
float fDirtY, fDirtX;
float fSlp, fFstRowSlp , flstRowSlp;
float fDist, fDist1, fDist2;
pHead = (CmLine *)malloc(sizeof(CmLine));
pHead->prev = NULL;
pHead->next = pFirstLine;
if (pFirstLine)
{
pFirstLine->prev = pHead;
}
fDirtY = (float)(pMode->firstLineRight.y-pMode->firstLineLeft.y);
fDirtX = (float)(pMode->firstLineRight.x-pMode->firstLineLeft.x);
fFstRowSlp = fDirtY / fDirtX;
fDirtY = (float)(pMode->lastLineRight.y-pMode->lastLineLeft.y);
fDirtX = (float)(pMode->lastLineRight.x-pMode->lastLineLeft.x);
flstRowSlp = fDirtY / fDirtX;
if(pMode->imgOrigin == 0)
{
fFstRowSlp = -fFstRowSlp;
flstRowSlp = -flstRowSlp;
}
/* 戞堦楍偺捈慄傪惍棟偟傑偡丅 */
#if 1
pMode->iArrLineDataPerRow[0][0] = pMode->firstLineLeft.x;
pMode->iArrLineDataPerRow[0][1] = pMode->firstLineLeft.y;
pMode->iArrLineDataPerRow[0][2] = pMode->firstLineRight.x;
pMode->iArrLineDataPerRow[0][3] = pMode->firstLineRight.y;
pLine = pHead->next;
i = 0;
iLineCntOfRow = 0;
while(pLine)
{
fDist1 = cmCalDistanceOfPointToLine(pLine->pt1, cmLine(pMode->firstLineLeft,pMode->firstLineRight));
fDist2 = cmCalDistanceOfPointToLine(pLine->pt2, cmLine(pMode->firstLineLeft,pMode->firstLineRight));
fDist1 = (fDist1 + fDist2) / 2;
if(fDist1 <= fDistErr && fabs(pLine->slope - fFstRowSlp) <= fSlopeErr)
{
i = i + 4;
if (i >= 100)
{
break;
}
iLineCntOfRow++;
pMode->iArrLineDataPerRow[0][i] = pLine->pt1.x;
pMode->iArrLineDataPerRow[0][i+1] = pLine->pt1.y;
pMode->iArrLineDataPerRow[0][i+2] = pLine->pt2.x;
pMode->iArrLineDataPerRow[0][i+3] = pLine->pt2.y;
//delete this CmLine
pTemp = pLine->next;
pLine->prev->next = pTemp;
if(pTemp)
{
pTemp->prev = pLine->prev;
}
pLine->prev = pLine->next = NULL;
cmReleaseCmLines(&pLine);
pLine = pTemp;
pTemp = NULL;
}
else
{
pLine = pLine->next;
}
}
pMode->iArrLineCntPerRow[0] = iLineCntOfRow;
pMode->fArrDistOfRowiToRow0[0] = 0.0;
#endif
/* 嵟屻偺堦楍偺捈慄傪惍棟偟傑偡丅 */
#if 1
pMode->iArrLineDataPerRow[99][0] = pMode->lastLineLeft.x;
pMode->iArrLineDataPerRow[99][1] = pMode->lastLineLeft.y;
pMode->iArrLineDataPerRow[99][2] = pMode->lastLineRight.x;
pMode->iArrLineDataPerRow[99][3] = pMode->lastLineRight.y;
fDist = cmCalDistanceOfPointToLine(pMode->lastLineLeft,
cmLine(pMode->firstLineLeft,pMode->firstLineRight));
pMode->fArrDistOfRowiToRow0[99] = fDist;
pLine = pHead->next;
i = 0;
iLineCntOfRow = 0;
while(pLine)
{
fDist1 = cmCalDistanceOfPointToLine(pLine->pt1, cmLine(pMode->lastLineLeft,pMode->lastLineRight));
fDist2 = cmCalDistanceOfPointToLine(pLine->pt2, cmLine(pMode->lastLineLeft,pMode->lastLineRight));
fDist1 = (fDist1 + fDist2) / 2;
if(fDist1 <= fDistErr && fabs(pLine->slope - flstRowSlp) <= fSlopeErr)
{
i = i + 4;
if (i >= 100)
{
break;
}
iLineCntOfRow++;
pMode->iArrLineDataPerRow[99][i] = pLine->pt1.x;
pMode->iArrLineDataPerRow[99][i+1] = pLine->pt1.y;
pMode->iArrLineDataPerRow[99][i+2] = pLine->pt2.x;
pMode->iArrLineDataPerRow[99][i+3] = pLine->pt2.y;
//delete this CmLine
pTemp = pLine->next;
pLine->prev->next = pTemp;
if(pTemp)
{
pTemp->prev = pLine->prev;
}
pLine->prev = pLine->next = NULL;
cmReleaseCmLines(&pLine);
pLine = pTemp;
pTemp = NULL;
}
else
{
pLine = pLine->next;
}
}
pMode->iArrLineCntPerRow[99] = iLineCntOfRow;
#endif
/* 拞娫偺楍偺捈慄傪惍棟偟傑偡丅 */
#if 1
i = 0;
while(pHead->next)
{
i++;
if(i >= 99)
{
break;
}
j = 4;
iLineCntOfRow=1;
pLine = pHead->next;
pHead->next = pLine->next;
if (pLine->next)
{
pLine->next->prev = pHead;
}
pLine->prev = pLine->next = NULL;
pMode->iArrLineDataPerRow[i][j] = pLine->pt1.x;
pMode->iArrLineDataPerRow[i][j+1] = pLine->pt1.y;
pMode->iArrLineDataPerRow[i][j+2] = pLine->pt2.x;
pMode->iArrLineDataPerRow[i][j+3] = pLine->pt2.y;
lineTemp = cmLine(pMode->firstLineLeft,pMode->lastLineLeft);
ptTemp = cmCalIntersectionOfTwoLines(pLine, &lineTemp, 0);
fDist = cmCalDistanceOfPointToLine(ptTemp, cmLine(pMode->firstLineLeft,pMode->firstLineRight));
pMode->fArrDistOfRowiToRow0[i] = fDist;
pMode->iArrLineDataPerRow[i][0] = ptTemp.x;
pMode->iArrLineDataPerRow[i][1] = ptTemp.y;
lineTemp = cmLine(pMode->firstLineRight,pMode->lastLineRight);
ptTemp = cmCalIntersectionOfTwoLines(pLine, &lineTemp, 0);
pMode->iArrLineDataPerRow[i][2] = ptTemp.x;
pMode->iArrLineDataPerRow[i][3] = ptTemp.y;
//test
if (i == 2)
{
printf("戞3楍捈慄:\n");
printf("Line.pt1(%d,%d)-->Line.pt2(%d,%d):%f\n", pLine->pt1.x,pLine->pt1.y,pLine->pt2.x,pLine->pt2.y, pLine->slope);
}
pNext = pHead->next;
while(pNext)
{
if (i==2)
{
printf("Line.pt1(%d,%d)-->Line.pt2(%d,%d):%f\n", pNext->pt1.x,pNext->pt1.y,
pNext->pt2.x,pNext->pt2.y, pNext->slope);
}
fDist1 = cmCalDistanceOfPointToLine(pNext->pt1, cmLine(pLine->pt1,pLine->pt2));
fDist2 = cmCalDistanceOfPointToLine(pNext->pt2, cmLine(pLine->pt1,pLine->pt2));
fDist1 = (fDist1 + fDist2) / 2;
if(fDist1 <= fDistErr && fabs(pLine->slope - pNext->slope) <= fSlopeErr)
{
j = j + 4;
if (j >= 100)
{
break;
}
iLineCntOfRow++;
pMode->iArrLineDataPerRow[i][j] = pNext->pt1.x;
pMode->iArrLineDataPerRow[i][j+1] = pNext->pt1.y;
pMode->iArrLineDataPerRow[i][j+2] = pNext->pt2.x;
pMode->iArrLineDataPerRow[i][j+3] = pNext->pt2.y;
//delete this CmLine
pTemp = pNext->next;
pNext->prev->next = pTemp;
if(pTemp)
{
pTemp->prev = pNext->prev;
}
pNext->prev = pNext->next = NULL;
cmReleaseCmLines(&pNext);
pNext = pTemp;
pTemp = NULL;
continue;
}
pNext = pNext->next;
}
pMode->iArrLineCntPerRow[i] = iLineCntOfRow;
cmReleaseCmLines(&pLine);
}
#endif
cmReleaseCmLines(&pHead);
/* 墶岦偔僜乕僥傿儞僌偟傑偡 */
for(i=0; i<100; i++)
{
if(pMode->iArrLineDataPerRow[i][4] == 0 && i != 99)
{
continue;
}
for(j=4; j<97; j=j+4)
{
if(pMode->iArrLineDataPerRow[i][j] == 0)
{
break;
}
for(k=j+4; k<97; k=k+4)
{
if(pMode->iArrLineDataPerRow[i][k] == 0)
{
break;
}
if(pMode->iArrLineDataPerRow[i][j] > pMode->iArrLineDataPerRow[i][k])
{
iArr[0] = pMode->iArrLineDataPerRow[i][j];
iArr[1] = pMode->iArrLineDataPerRow[i][j+1];
iArr[2] = pMode->iArrLineDataPerRow[i][j+2];
iArr[3] = pMode->iArrLineDataPerRow[i][j+3];
pMode->iArrLineDataPerRow[i][j] = pMode->iArrLineDataPerRow[i][k];
pMode->iArrLineDataPerRow[i][j+1] = pMode->iArrLineDataPerRow[i][k+1];
pMode->iArrLineDataPerRow[i][j+2] = pMode->iArrLineDataPerRow[i][k+2];
pMode->iArrLineDataPerRow[i][j+3] = pMode->iArrLineDataPerRow[i][k+3];
pMode->iArrLineDataPerRow[i][k] = iArr[0];
pMode->iArrLineDataPerRow[i][k+1] = iArr[1];
pMode->iArrLineDataPerRow[i][k+2] = iArr[2];
pMode->iArrLineDataPerRow[i][k+3] = iArr[3];
}
}
}
}
/* 廲曽岦僜乕僥傿儞僌偟傑偡 */
for(i=1; i<99; i++)
{
int tempLineCnt, tempData;
float tempDist;
if(pMode->iArrLineDataPerRow[i][4] == 0)
{
break;
}
for(j=i+1; j<99; j++)
{
if(pMode->iArrLineDataPerRow[j][4] == 0)
{
break;
}
if(pMode->fArrDistOfRowiToRow0[i] > pMode->fArrDistOfRowiToRow0[j])
{
//exchange this two line data
tempLineCnt = pMode->iArrLineCntPerRow[i];
pMode->iArrLineCntPerRow[i] = pMode->iArrLineCntPerRow[j];
pMode->iArrLineCntPerRow[j] = tempLineCnt;
tempDist = pMode->fArrDistOfRowiToRow0[i];
pMode->fArrDistOfRowiToRow0[i] = pMode->fArrDistOfRowiToRow0[j];
pMode->fArrDistOfRowiToRow0[j] = tempDist;
for(k=0; k<100; k++)
{
tempData = pMode->iArrLineDataPerRow[i][k];
pMode->iArrLineDataPerRow[i][k] = pMode->iArrLineDataPerRow[j][k];
pMode->iArrLineDataPerRow[j][k] = tempData;
}
}
}
}
}
/**
* @fn cmDeletePhonyRows
*
* @brief
* 揈梫丗
*
* @param[in] pModel
* @param[in] pImgGray
* @param[in] iCriticalGray
*
* @return rows count
*/
int cmDeletePhonyRows(CmQueueAreaModel *pModel, IplImage *pImgGray, int iCriticalGray)
{
int i,j,x,y,m,n, gray;
float validPixelCnt, validPercent;
CvPoint pt1,pt2;
unsigned char *imageData = pImgGray->imageData;
/* delete the lines that are not at row'position. */
for(i=1; i<99;)
{
validPixelCnt = 0.0;
if (pModel->iArrLineDataPerRow[i][4] == 0)
{
break;
}
pt1.x = pModel->iArrLineDataPerRow[i][4];
pt1.y = pModel->iArrLineDataPerRow[i][4+1];
pt2.x = pModel->iArrLineDataPerRow[i][4+2];
pt2.y = pModel->iArrLineDataPerRow[i][4+3];
#if DEL_LIN_GRAY_ON
if(cmIsTheLineRealObject(pImgGray, cmLine(pt1,pt2), iCriticalGray) == 0)
{
for(m=i; m<97; m++)
{
pModel->iArrLineCntPerRow[m] = pModel->iArrLineCntPerRow[m+1];
pModel->fArrDistOfRowiToRow0[m] = pModel->fArrDistOfRowiToRow0[m+1];
for(n=0;n<100;n++)
{
pModel->iArrLineDataPerRow[m][n] = pModel->iArrLineDataPerRow[m+1][n];
}
}
continue;
}
#endif
i++;
}
/* */
pModel->iArrLineCntPerRow[i] = pModel->iArrLineCntPerRow[99];
pModel->fArrDistOfRowiToRow0[i] = pModel->fArrDistOfRowiToRow0[99];
pModel->iArrLineCntPerRow[99] = 0;
pModel->fArrDistOfRowiToRow0[99] = 0;
for(n=0;n<100;n++)
{
pModel->iArrLineDataPerRow[i][n] = pModel->iArrLineDataPerRow[99][n];
pModel->iArrLineDataPerRow[99][n] = 0;
}
return i+1;
}
/**
* @fn cmComb
*
* @brief
* 揈梫丗Cnm = n!/m!*(n-m)!
*
* @param[in] n
* @param[in] m
* @param[in] buff[]
* @param[in] count
*
* @return
*/
void cmComb( int n, int m ,int buff[], int *count)
{
int i;
if( m == 0 )
{
for( i=0;i<*count;++i)
{
combuf[combCnt][i] = buff[(*count)-i-1];
printf("%d ", buff[i] );
}
combCnt++;
printf("\n");
return;
}
for( i=0; i<= n - m; ++i )
{
buff[*count] = n-i;
*count = *count + 1;
cmComb( n-i-1, m-1,buff, count );
*count = *count -1;
}
}
/**
* @fn cmCombinationQueqes
*
* @brief
* 揈梫丗
*
* @param[in] pModel
*
* @return 1:success; else 0,-1,...:failure
*/
int cmCombinationQueqes(CmQueueAreaModel *pModel)
{
int buff[100];//嵞婣娭悢梡
int no = 0, count = 0;
int i,j,k,m,n;
float dist1, dist2, distRatio,preDistRatio ;
float sumOfRatonSub[100], MinSumOfRatonSub;
int minIndex;
/* 慻崌曄悢n,m傪庢摼偡傞丅 */
m = pModel->lineCount;
for(i=1,n=0; i < 100; i++)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -