CColor CShader::ShadeGloss(const CRay &ray, CIntersactionInfo &intersectionInfo) { CColor cLamber; float fLightColor = 1.f; for (int i = 0; i < GetLightScene().GetLightsNumber(); ++i) { const CVector3DF vNormal = intersectionInfo.GetFacingNormal(ray); const CVector3DF& vIntersection = intersectionInfo.m_vIntersectionPoint; const CVector3DF vLIghtDirection = GetRaytracer()->GetCamera().GetCameraPos() - vIntersection; // const CVector3DF vLIghtDirection = GetLightScene().GetLight(i).GetPosition() - vIntersection; const CVector3DF vLightDirNorm = vLIghtDirection.Normalized(); float fCos = vLightDirNorm.Dot(vNormal); CColor colorForLight(1.0f, 1.0f, 1.0f); if (fCos > 0.0f) { // const float fLength = vLIghtDirection.Length(); // fCos *= 500.0f / fLength; const CVector3DF vFromLightNorm = -vLightDirNorm; const CVector3DF vReflection = CUtils::Reflect(vFromLightNorm, vNormal); float fCosRefl = vReflection.Dot(vNormal); if (fCosRefl > 0.0f) { fCosRefl = qPow(fCosRefl, 3); colorForLight *= fCosRefl; fLightColor *= fCosRefl; } else { colorForLight *= 0.3f; fLightColor *= 0.3f; } } else { colorForLight *= 0.3f; fLightColor *= 0.3f; } // intersectionInfo.color += colorForLight; cLamber = colorForLight;// * fLightColor; } return cLamber; }
CColor CShader::ShadeLambert(const CRay &ray, CIntersactionInfo &intersectionInfo) { CColor cLamber; float fLightColor = 1.f; for (int i = 0; i < GetLightScene().GetLightsNumber(); ++i) { const CVector3DF& vIntersection = intersectionInfo.m_vIntersectionPoint; const CVector3DF vLIghtDirection = GetLightScene().GetLight(i).GetPosition() - vIntersection; float fCos = vLIghtDirection.Normalized().Dot(intersectionInfo.GetFacingNormal(ray)); CColor colorForLight(1.0f, 1.0f, 1.0f); colorForLight = intersectionInfo.color; if (fCos > 0.0f) { // const float fLength = vLIghtDirection.Length(); // fCos /= fLength; colorForLight *= fCos; fLightColor *= fCos; // colorForLight *= intersectionInfo.color; // colorForLight *= fLightColor; // colorForLight *= 1.f/GetLightScene().GetLightsNumber(); } else { colorForLight = 0.0f; fLightColor = 0.0f; } // intersectionInfo.color += colorForLight; cLamber = colorForLight;// * fLightColor; } return cLamber; }
//传入各灯组的状态,返回场景状态编号 int CTrafficLightImpl::TransitionScene(const LIGHT_TEAM_STATUS& ltsInfo, const int& iSceneCount, const int& iLastOkLightStatus, bool fFlag) { int iRet = -1; if( !fFlag ) return GetSceneNumber(ltsInfo, iSceneCount); if( ltsInfo.nTeamCount == 0 || ltsInfo.nTeamCount > MAX_TRAFFICLIGHT_COUNT ) return iRet; //场景 TRAFFICLIGHT_SCENE* pts = new TRAFFICLIGHT_SCENE[ltsInfo.nTeamCount]; if( pts == NULL ) return iRet; int* piUsed = new int[ltsInfo.nTeamCount * 4]; if( piUsed == NULL ) { delete[] pts; return iRet; } memset(piUsed, 0, sizeof(int) *(ltsInfo.nTeamCount * 4)); memset(pts, 0, sizeof(TRAFFICLIGHT_SCENE) * ltsInfo.nTeamCount); TRAFFICLIGHT_TYPE lt; int iCount = 0; DWORD32 dwTmp = 0; for( DWORD32 i = 0; i < ltsInfo.nTeamCount; ++i ) { dwTmp = ltsInfo.pdwStatus[i]; iCount = ltsInfo.pnLightCount[i]; for(int k = iCount - 1; k >= 0; --k) { if( (dwTmp & 0x01) && GetTrafficLightType(i, k, <) ) { LIGHT_STATUS tlsStatus = lt.tlsStatus; //如果灯组是三色灯 zhaopy 不判断灯颜色,在灯不亮时会有问题,因绿灯域值太低。 //if (lt.tlsStatus == TLS_UNSURE) //外接红绿灯信号时,不能进入此判断 if (m_tlpTrafficLightParam.iCheckType != 1) { switch (dwTmp & 0x0F) { case TS_RED: tlsStatus = TLS_RED; break; case TS_YELLOW: tlsStatus = TLS_YELLOW; break; case TS_GREEN: tlsStatus = TLS_GREEN; break; default: tlsStatus = TLS_UNSURE; break; } } switch(lt.tpPos) { case TP_LEFT: pts[i].lsLeft = tlsStatus; piUsed[i * 4 + 0] = 1; break; case TP_RIGHT: pts[i].lsRight = tlsStatus; piUsed[i * 4 + 1] = 1; break; case TP_FORWARD: pts[i].lsForward = tlsStatus; piUsed[i * 4 + 2] = 1; break; case TP_TURN: pts[i].lsTurn = tlsStatus; piUsed[i * 4 + 3] = 1; break; case TP_UNSURE: { //未定义只能用在黄灯 if( tlsStatus == TLS_YELLOW && iLastOkLightStatus != -1 ) { int iNextStatus = (iLastOkLightStatus + 1) % iSceneCount; TRAFFICLIGHT_SCENE tsLast, tsNext; GetLightScene(iLastOkLightStatus, &tsLast); GetLightScene(iNextStatus, &tsNext); if( (tsLast.lsForward == TLS_GREEN && tsNext.lsForward == TLS_YELLOW) || tsLast.lsForward == TLS_YELLOW ) { pts[i].lsForward = TLS_YELLOW; piUsed[i * 4 + 2] = 1; } else if( (tsLast.lsLeft == TLS_GREEN && tsNext.lsLeft == TLS_YELLOW) || tsLast.lsLeft == TLS_YELLOW ) { pts[i].lsLeft = TLS_YELLOW; piUsed[i * 4 + 0] = 1; } else if( (tsLast.lsRight == TLS_GREEN && tsNext.lsRight == TLS_YELLOW) || tsLast.lsRight == TLS_YELLOW) { pts[i].lsRight = TLS_YELLOW; piUsed[i * 4 + 1] = 1; } else if( (tsLast.lsTurn == TLS_GREEN && tsNext.lsTurn == TLS_YELLOW) || tsLast.lsTurn == TLS_YELLOW ) { pts[i].lsTurn = TLS_YELLOW; piUsed[i * 4 + 3] = 1; } } } break; default: break; } } dwTmp >>= 4; } } TRAFFICLIGHT_SCENE tsDest = {TLS_UNSURE, TLS_UNSURE, TLS_UNSURE, TLS_UNSURE}; bool fL, fR, fF, fT; fL = fR = fF = fT = false; for(DWORD32 i = 0; i < ltsInfo.nTeamCount; ++i) { if( !fL && pts[i].lsLeft != TLS_UNSURE && piUsed[i * 4 + 0] == 1) { tsDest.lsLeft = pts[i].lsLeft; fL = true; } else if( fL && piUsed[i * 4 + 0] == 1 && pts[i].lsLeft != tsDest.lsLeft ) { tsDest.lsLeft = TLS_UNSURE; } if( !fR && pts[i].lsRight != TLS_UNSURE && piUsed[i * 4 + 1] == 1) { tsDest.lsRight = pts[i].lsRight; fR = true; } else if( fR && piUsed[i * 4 + 1] == 1 && pts[i].lsRight != tsDest.lsRight ) { tsDest.lsRight = TLS_UNSURE; } if( !fF && pts[i].lsForward != TLS_UNSURE && piUsed[i * 4 + 2] == 1) { tsDest.lsForward = pts[i].lsForward; fF = true; } else if( fF && piUsed[i * 4 + 2] == 1 && pts[i].lsForward != tsDest.lsForward ) { tsDest.lsForward = TLS_UNSURE; } if( !fT && pts[i].lsTurn != TLS_UNSURE && piUsed[i * 4 + 3] == 1) { tsDest.lsTurn = pts[i].lsTurn; fT = true; } else if( fT && piUsed[i * 4 + 3] == 1 && pts[i].lsTurn != tsDest.lsTurn ) { tsDest.lsTurn = TLS_UNSURE; } } TRAFFICLIGHT_SCENE tsTmp; for(int i = 0; i < iSceneCount; ++i) { if( GetLightScene(i, &tsTmp) ) { if( tsTmp.lsLeft == tsDest.lsLeft && tsTmp.lsRight == tsDest.lsRight && tsTmp.lsForward == tsDest.lsForward && tsTmp.lsTurn == tsDest.lsTurn ) { iRet = i; break; } } } delete[] pts; delete[] piUsed; return iRet; }
HRESULT CTrafficLightImpl::RecognizeTrafficLight(HV_COMPONENT_IMAGE* pSceneImage, int* iCurrentStatus, int* iLastStatus, bool fNight) { if (m_tlpTrafficLightParam.iLightGroupCount <= 0) return S_FALSE; HRESULT hResult = S_FALSE; static int nSceneStatusPos= 0; LIGHT_TEAM_STATUS ltsInfo; ltsInfo.nTeamCount = m_tlpTrafficLightParam.iLightGroupCount; bool fDynamic = false; static int iSkipFrameNo = m_tlpTrafficLightParam.iSkipFrameNo; for(int i = 0; i<m_tlpTrafficLightParam.iLightGroupCount; i++) { if (m_tlpTrafficLightParam.iCheckType == 0) { //红绿灯识别 if (iSkipFrameNo == 0 && m_tlpTrafficLightParam.iAutoScanLight == 1) { m_rgLightInfo[i].UpdateStatus3( pSceneImage , fNight); m_rgLightRect[i] = m_rgLightInfo[i].GetRect(); m_rgLightStatus[i] = m_rgLightInfo[i].GetLastStatus(); fDynamic = true; } else { m_rgLightInfo[i].UpdateStatus( pSceneImage ); m_rgLightRect[i] = m_rgLightInfo[i].GetRect(); m_rgLightStatus[i] = m_rgLightInfo[i].GetLastStatus(); } sv::utTrace("<123dsp light>status:%08x.", m_rgLightStatus[i]); } else { if (m_pCallback == NULL) { return E_FAIL; } m_rgLightRect[i] = m_rgLightInfo[i].GetRect(); BYTE8 bLevel = 0; if (S_OK != m_pCallback->GetTrafficLightStatus(&bLevel)) { return E_FAIL; } m_rgLightStatus[i] = GetIOStatus(i, bLevel); } m_rgLightInfo[i].m_iRedLightCountFinded = 0; m_rgLightInfo[i].m_iGreenLightCountFinded = 0; ltsInfo.pdwStatus[i] = m_rgLightStatus[i]; ltsInfo.pnLightCount[i] = m_rgLightInfo[i].GetPosCount(); //传检测到的灯传出去显示 if(m_pCallback) { m_pCallback->TrafficLightStatusEx( i, m_rgLightInfo[i].m_iRedLightCountFinded, m_rgLightInfo[i].m_rcRedLightPosFinded, m_rgLightInfo[i].m_iGreenLightCountFinded, m_rgLightInfo[i].m_rcGreenLightPosFinded ); } } if (iSkipFrameNo <= 0) { iSkipFrameNo = m_tlpTrafficLightParam.iSkipFrameNo; } else { iSkipFrameNo--; } //取得当前场景 bool fFlag = (m_tlpTrafficLightParam.iSceneCheckMode == 0); int nCurScene = TransitionScene(ltsInfo, m_tlpTrafficLightParam.iSceneCount, m_iLastOkLightStatus, fFlag); sv::utTrace("<123dsp light>CurScene:%08x.", nCurScene); //调整发送出去的红灯的坐标 if (m_tlpTrafficLightParam.iAutoScanLight == 1 && fDynamic) { ////更新最后可正常识别的灯组的位置 if (nCurScene != -1) { for (int i = 0; i < m_tlpTrafficLightParam.iLightGroupCount; i++) { m_rgLightInfo[i].UpdateLastSureLight(m_rgLightInfo[i].GetRect()); } } else { //处于中间状态时,则将灯红坐标还原回最后可识别出的状态 for (int i = 0; i < m_tlpTrafficLightParam.iLightGroupCount; i++) { m_rgLightInfo[i].SetRect(m_rgLightInfo[i].GetLastSureLight(), m_rgLightInfo[i].GetPosCount(), m_rgLightInfo[i].GetLightDirection()); } } //更新红灯的坐标 UpdateRedLightPos(); } if( m_pCallback ) { int nSceneStatus = -1; if( m_pCallback != NULL) { //把红灯的位置传出去 m_pCallback->TrafficLightStatus( m_tlpTrafficLightParam.iLightGroupCount, m_rgLightStatus, &nSceneStatus, m_rgLightRect, m_iRedLightCount, m_rgRedLightRect, pSceneImage ); } nSceneStatus = nCurScene; #if 0 //新增输出红绿灯灯组信息 lixh 2011-09-19 static char pLightStatus[64] = "", pLastStatus[64] = ""; memset(pLightStatus, 0, 64); PrintLightStatus(ltsInfo , pLightStatus , 64); if(0 != strcmp(pLightStatus, pLastStatus)) { strcpy(pLastStatus, pLightStatus); sprintf(g_szDebugInfo, "rg status = %s", pLastStatus); for(int i = 0; i < m_tlpTrafficLightParam.iLightGroupCount; i++) { CRect rc = m_rgLightInfo[i].GetRect(); sprintf(g_szDebugInfo + strlen(g_szDebugInfo), "(%d,%d,%d,%d)", rc.left, rc.top, rc.right, rc.bottom); } } #endif m_iCurLightStatus = nSceneStatus; //如果用户设置了场景状态则加入场景状态队列 //if(hr == S_OK && nSceneStatus != -1) if( nSceneStatus != -1 ) { m_iErrorSceneCount = 0; SetSceneStatus(nSceneStatusPos, nSceneStatus); nSceneStatusPos++; //下一个存储位置,同时也是计数 int iRelayTimeMs = m_tlpTrafficLightParam.iValidSceneStatusCount * 100; //加入场景状态后判断是否输出 if(m_tlpTrafficLightParam.iValidSceneStatusCount > 0 && nSceneStatusPos >= m_tlpTrafficLightParam.iValidSceneStatusCount) { int nLastPos = nSceneStatusPos - 1; int nLastStatus = GetSceneStatus(nLastPos); BOOL fValid = TRUE; for( int i = nLastPos - 1; i > (nLastPos - m_tlpTrafficLightParam.iValidSceneStatusCount); i--) { if( GetSceneStatus(i) != nLastStatus) { fValid = FALSE; break; } } //如果是快速模式,则有一帧判断为下一场景就跳变. if( m_fCheckSpeed && !fValid && m_iLastOkLightStatus != -1 && m_iLastOkLightStatus != nSceneStatus) { int iNextStatus = (m_iLastOkLightStatus + 1) % m_tlpTrafficLightParam.iSceneCount; if( iNextStatus == nSceneStatus ) { fValid = true; iRelayTimeMs = 100; nLastStatus = nSceneStatus; } } if( fValid && nLastStatus != m_iLastLightStatus) { //如果有绿灯变成红灯且设有黄灯延迟 TRAFFICLIGHT_SCENE tsLast, tsRelay; GetLightScene(m_iLastOkLightStatus, &tsLast); GetLightScene(nLastStatus, &tsRelay); DWORD32 dwTick = GetSystemTick(); bool fRelayTimeOut = true; if( m_tlpTrafficLightParam.iRedLightDelay > 0 ) { if( tsLast.lsLeft == TLS_GREEN && tsRelay.lsLeft == TLS_RED ) { if( m_ltRedRelay.dwLeft == 0 ) m_ltRedRelay.dwLeft = dwTick; if( int(dwTick - m_ltRedRelay.dwLeft) < (m_tlpTrafficLightParam.iRedLightDelay * 1000) ) { fRelayTimeOut = false; } } if( tsLast.lsForward == TLS_GREEN && tsRelay.lsForward == TLS_RED ) { if( m_ltRedRelay.dwForward == 0 ) m_ltRedRelay.dwForward = dwTick; if( int(dwTick - m_ltRedRelay.dwForward) < (m_tlpTrafficLightParam.iRedLightDelay * 1000) ) { fRelayTimeOut = false; } } if( tsLast.lsRight == TLS_GREEN && tsRelay.lsRight == TLS_RED ) { if( m_ltRedRelay.dwRight == 0 ) m_ltRedRelay.dwRight = dwTick; if( int(dwTick - m_ltRedRelay.dwRight) < (m_tlpTrafficLightParam.iRedLightDelay * 1000) ) { fRelayTimeOut = false; } } if( tsLast.lsTurn == TLS_GREEN && tsRelay.lsTurn == TLS_RED ) { if( m_ltRedRelay.dwTurn == 0 ) m_ltRedRelay.dwTurn = dwTick; if( int(dwTick - m_ltRedRelay.dwTurn) < (m_tlpTrafficLightParam.iRedLightDelay * 1000) ) { fRelayTimeOut = false; } } } if( fRelayTimeOut ) { m_ltRedRelay.Reset(); m_iLastLightStatus = nLastStatus; TRAFFICLIGHT_SCENE tsSceneStatus, tsNow; GetLightScene(m_iLastLightStatus, &tsSceneStatus); GetLightScene(m_iLastLightStatus, &tsNow); int iGreenRelayMs = 1000; //新增输出红绿灯灯组信息 lixh 2011-09-19 char pLightStatus[64]; memset(pLightStatus, 0, 64); PrintLightStatus(ltsInfo , pLightStatus , 64); if( m_pCallback != NULL ) { m_pCallback->TrafficSceneStatus(tsSceneStatus,pLightStatus); } //更新红灯开始时间 if( nLastStatus != -1 ) { m_iLastOkLightStatus = nLastStatus; } //DWORD32 dwTimeLow, dwTimeHigh; //ConvertTickToSystemTime((GetSystemTick() - iRelayTimeMs), dwTimeLow, dwTimeHigh); //一体机代码,红绿灯时间只有L,没有H,在ARM端在通过ConvertTickToSystemTime进行转换,黄国超修改,2011-07-21 DWORD32 dwTimeLow = GetSystemTick() - iRelayTimeMs, dwTimeHigh = 0; if( tsNow.lsLeft == TLS_RED && tsLast.lsLeft != TLS_RED ) { m_redrealtime.dwLeftL = dwTimeLow; m_redrealtime.dwLeftH = dwTimeHigh; } if( tsNow.lsLeft == TLS_GREEN && tsLast.lsLeft != TLS_GREEN ) { m_greentick.dwLeft = GetSystemTick() - iRelayTimeMs - iGreenRelayMs; } else if( tsNow.lsLeft != TLS_GREEN ) { m_greentick.dwLeft = 0; } if( tsNow.lsForward == TLS_RED && tsLast.lsForward != TLS_RED ) { m_redrealtime.dwForwardL = dwTimeLow; m_redrealtime.dwForwardH = dwTimeHigh; } if( tsNow.lsForward == TLS_GREEN && tsLast.lsForward != TLS_GREEN ) { m_greentick.dwForward = GetSystemTick() - iRelayTimeMs - iGreenRelayMs; } else if( tsNow.lsForward != TLS_GREEN ) { m_greentick.dwForward = 0; } if( tsNow.lsRight == TLS_RED && tsLast.lsRight != TLS_RED ) { m_redrealtime.dwRightL = dwTimeLow; m_redrealtime.dwRightH = dwTimeHigh; } if( tsNow.lsRight == TLS_GREEN && tsLast.lsRight != TLS_GREEN ) { m_greentick.dwRight = GetSystemTick() - iRelayTimeMs - iGreenRelayMs; } else if( tsNow.lsRight != TLS_GREEN ) { m_greentick.dwRight = 0; } if( tsNow.lsTurn == TLS_RED && tsLast.lsTurn != TLS_RED ) { m_redrealtime.dwTurnL = dwTimeLow; m_redrealtime.dwTurnH = dwTimeHigh; } if( tsNow.lsTurn == TLS_GREEN && tsLast.lsTurn != TLS_GREEN ) { m_greentick.dwTurn = GetSystemTick() - iRelayTimeMs - iGreenRelayMs; } else if( tsNow.lsTurn != TLS_GREEN ) { m_greentick.dwTurn = 0; } } } } } else { //如果无效场景数大于设定的值,则把当前的场景设成-1. m_iErrorSceneCount++; if( m_iErrorSceneCount >= (m_tlpTrafficLightParam.iValidSceneStatusCount * 2)) { m_iLastLightStatus = -1; TRAFFICLIGHT_SCENE tsSceneStatus; GetLightScene(m_iLastLightStatus, &tsSceneStatus); //新增输出红绿灯灯组信息 lixh 2011-09-19 char pLightStatus[64]; memset(pLightStatus, 0, 64); PrintLightStatus(ltsInfo , pLightStatus , 64); if( m_pCallback != NULL ) { m_pCallback->TrafficSceneStatus(tsSceneStatus,pLightStatus); } //无效场景有可能是中间状态,红灯时间不能重置。 } //如果无效场景帧数大过设定的值,则重置红绿灯框位置,红灯时间重置 if( m_iErrorSceneCount > MAX_ERROR_COUNT ) { m_iErrorSceneCount = 0; m_iLastOkLightStatus = -1; for(int i = 0; i < 4; ++i) { m_redrealtime.Reset(); m_greentick.Reset(); } if( m_tlpTrafficLightParam.iAutoScanLight == 1 ) { for(int i = 0; i <m_tlpTrafficLightParam.iLightGroupCount; ++i) { if( S_OK == m_rgLightInfo[i].ReScan() ) { HV_Trace(5, "TrafficLight ReScan ...\n"); } } } } } } *iCurrentStatus = m_iCurLightStatus; *iLastStatus = m_iLastLightStatus; return hResult; }