我把遞回轉換為非遞回方式,vector作為堆疊,執行時間從19毫秒增加到了7500毫秒,vector效率有這么低嗎?
uj5u.com熱心網友回復:
這個要看你的代碼是怎么寫的了,方便的話可以貼出來看看。vector一般在專案里還是很常用的,不至于那么慢。
uj5u.com熱心網友回復:
void TraceEdge(double * pdMag, unsigned char * pucEdge, int iIWd, int y, int x, double dThrLo,int iRecuTm, int iRecuLim)
{
// 對8鄰域象素進行查詢
int xNb[8] = {1, 1, 0,-1,-1,-1, 0, 1};
int yNb[8] = {0, 1, 1, 1,0 ,-1,-1,-1};
int yy ;
int xx ;
int k ;
for(k=0; k<8; k++)
{
yy = y + yNb[k] ;
xx = x + xNb[k] ;
// g_vecStackX.push_back(x);
// g_vecStackY.push_back(y);
// g_vecNbIdx.push_back(k);
// 如果該象素為可能的邊界點,又沒有處理過
// 并且梯度大于閾值
if(pucEdge[yy*iIWd+xx] == 128 && pdMag[yy*iIWd+xx]>=dThrLo)
{
// 把該點設定成為邊界點
pucEdge[yy*iIWd+xx] = 255 ;
// 以該點為中心進行跟蹤
if(iRecuTm < iRecuLim)
{
iRecuTm++;
TraceEdge(pdMag, pucEdge, iIWd, yy, xx, dThrLo, iRecuTm, iRecuLim);
}
}
}
}
// 非遞回, 深度優先, 注意該函式不對根結點進行操作
void TraceEdge_dfs(double * pdMag, unsigned char * pucEdge, int iIWd, int iIHi, int x, int y, double dThrLo)
{
// 對8鄰域象素進行查詢
int xNb[8] = {1, 1, 0,-1,-1,-1, 0, 1};
int yNb[8] = {0, 1, 1, 1, 0,-1,-1,-1};
// 8鄰域索引開始和結尾
int iNbB = 0;
int iNbE = 8;
// 正在遍歷的路徑頂點
vector<int> vecStackX;
vector<int> vecStackY;
// 正在遍歷的關聯頂點, 對應8鄰域的地址編號
vector<int> vecNbIdx;
vecStackX.push_back(x);
vecStackY.push_back(y);
vecNbIdx.push_back(iNbB);
// 回溯標志, 遍歷完之后如果bBacktrack為TRUE表示沒有找到可擴路
BOOL bBacktrack = FALSE;
while(!vecStackX.empty())
{
int iX = vecStackX.back();
int iY = vecStackY.back();
int & iNbIdx = vecNbIdx.back();
// g_vecStackX.push_back(iX);
// g_vecStackY.push_back(iY);
// g_vecNbIdx.push_back(iNbIdx);
if(bBacktrack)
{
iNbIdx += 1;
bBacktrack = FALSE;
}
if(iNbIdx != iNbE)
{
int iNbX = iX + xNb[iNbIdx];
int iNbY = iY + yNb[iNbIdx];
if((iNbX >= 0) && (iNbX < iIWd) && (iNbY >= 0) && (iNbY < iIHi))
{
if((pucEdge[iNbY * iIWd + iNbX] == 128) && (pdMag[iNbY * iIWd + iNbX] >= dThrLo))
{
// 把該點設定成為邊界點
pucEdge[iNbY*iIWd+iNbX] = 255;
vecStackX.push_back(iNbX);
vecStackY.push_back(iNbY);
vecNbIdx.push_back(iNbB);
continue;
}
}
// 下一個鄰域點, 參考資料型別, 直接修改存盤堆疊
iNbIdx += 1;
}
else
{
// 回溯, 原路回傳, 第一步
vecStackX.pop_back();
vecStackY.pop_back();
vecNbIdx.pop_back();
bBacktrack = TRUE;
}
}
}
uj5u.com熱心網友回復:
canny演算法中的邊界點跟蹤部分的代碼uj5u.com熱心網友回復:
遞回層次問題不用考慮,我已經把遞回層次設定的很大,這個問題可以排除轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/239762.html
標籤:圖形處理/算法
上一篇:請問下有沒有辦法用批處理或者命令列小程式確定系統引導磁區?
下一篇:如何獲得一般屬性頁對話框指標
