⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 queuearea.c

📁 jiance jichang paidui de moxing.
💻 C
📖 第 1 页 / 共 3 页
字号:
							}
							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 + -