void CalibrationUtils::cameraToScreenPosition(float &x, float &y) { cameraToScreenSpace(x, y); //is this right to avoid boundingbox overflow? this overflow occurs due to new angle box // if(y > _camHeight) y = _camHeight; // if(y < 0) y = 0; // if(x > _camWidth) x = _camWidth; // if(x < 0) x = 0; // // int pos = (int)y * (int)_camWidth + (int)x; // // x = cameraToScreenMap[pos].X; // y = cameraToScreenMap[pos].Y; }
//! Convertion des valeurs d'affichage théorique en valeur réelle de tout les points void CalibrationUtils::computeCameraToScreenMap() { cameraToScreenMap = new vector2df[_camWidth * _camHeight]; int p = 0; for(int y = 0; y < _camHeight; y++) { for(int x = 0; x < _camWidth; x++) { //On cast les valeurs en réel float transformedX = (float)x; float transformedY = (float)y; //Convertion de la valeur théorique de tout les points, en valeur réelle cameraToScreenSpace(transformedX, transformedY); cameraToScreenMap[p] = vector2df(transformedX, transformedY); p++; } } }
//Compute a map of camera to screen coordinates void CalibrationUtils::computeCameraToScreenMap() { cameraToScreenMap = new vector2df[_camWidth * _camHeight]; int p = 0; for(int y = 0; y < _camHeight; y++) { for(int x = 0; x < _camWidth; x++) { //cast to float float transformedX = (float)x; float transformedY = (float)y; //convert camera to screenspace for all possible camera positions cameraToScreenSpace(transformedX, transformedY); //save these into a map of transformed camera to screenspace positions cameraToScreenMap[p] = vector2df(transformedX, transformedY); p++; } } }
void ofxMultiplexer::computeOffsetMap(unsigned int* cameraOffsetMap,vector2df* calibrationPoints,int cameraPosition) { vector2df* screenPoints = (vector2df*)malloc((actualCalibrationGridWidth+1) * (actualCalibrationGridHeight+1) * sizeof(vector2df)); vector2df* cameraPoints = (vector2df*)malloc((actualCalibrationGridWidth+1) * (actualCalibrationGridHeight+1) * sizeof(vector2df)); int* triangles = (int*)malloc((actualCalibrationGridWidth+1)*(actualCalibrationGridHeight+1)*6*sizeof(int)); int t = 0; for(int j = 0; j < actualCalibrationGridHeight; j++) { for(int i = 0; i < actualCalibrationGridWidth; i++) { triangles[t+0] = (i+0) + ((j+0) * (actualCalibrationGridWidth+1)); triangles[t+1] = (i+1) + ((j+0) * (actualCalibrationGridWidth+1)); triangles[t+2] = (i+0) + ((j+1) * (actualCalibrationGridWidth+1)); t += 3; triangles[t+0] = (i+1) + ((j+0) * (actualCalibrationGridWidth+1)); triangles[t+1] = (i+1) + ((j+1) * (actualCalibrationGridWidth+1)); triangles[t+2] = (i+0) + ((j+1) * (actualCalibrationGridWidth+1)); t += 3; } } int size = actualStitchedFrameWidth * actualStitchedFrameHeight; int LeftX = 0; int TopY = 0; for (int i=0;i<size;i++) { if ((cameraMap[0][i] == cameraPosition) || (cameraMap[1][i] == cameraPosition) || (cameraMap[2][i] == cameraPosition) || (cameraMap[3][i] == cameraPosition)) { LeftX = i % actualStitchedFrameWidth; TopY = i / actualStitchedFrameWidth; break; } } int globalCalibrationGridWidth = (interleaveMode ? actualCalibrationGridWidth * actualCameraGridWidth - actualCameraGridWidth + 1 : actualCalibrationGridWidth * actualCameraGridWidth); int globalCalibrationGridHeight = (interleaveMode ? actualCalibrationGridHeight * actualCameraGridHeight - actualCameraGridHeight + 1 : actualCalibrationGridHeight * actualCameraGridHeight); float calibrationGridCellWidth = ((float)actualStitchedFrameWidth) / globalCalibrationGridWidth; float calibrationGridCellHeight = ((float)actualStitchedFrameHeight) / globalCalibrationGridHeight; int cameraX = cameraPosition % actualCameraGridWidth; int cameraY = cameraPosition / actualCameraGridWidth; cameraX *= (interleaveMode ? (actualCalibrationGridWidth-1) : actualCalibrationGridWidth); cameraY *= (interleaveMode ? (actualCalibrationGridHeight-1) : actualCalibrationGridHeight); int P = 0; for (int j=0;j<=actualCalibrationGridHeight;j++) { for (int i=0;i<=actualCalibrationGridWidth;i++) { screenPoints[P].X = (float)(calibrationGridCellWidth * i + LeftX); screenPoints[P].Y = (float)(calibrationGridCellHeight * j + TopY); P++; } } memcpy((void*)cameraPoints,calibrationPoints,(actualCalibrationGridWidth+1) * (actualCalibrationGridHeight+1) * sizeof(vector2df)); memset(cameraOffsetMap,0,actualStitchedFrameWidth * actualStitchedFrameHeight * sizeof(unsigned int)); int T = 0; for (int j=0;j<actualStitchedFrameHeight;j++) { for (int i=0;i<actualStitchedFrameWidth;i++) { unsigned int transformedX = i; unsigned int transformedY = j; if ((cameraMap[0][i+j*actualStitchedFrameWidth] != cameraPosition)&& (cameraMap[1][i+j*actualStitchedFrameWidth] != cameraPosition)&& (cameraMap[2][i+j*actualStitchedFrameWidth] != cameraPosition)&& (cameraMap[3][i+j*actualStitchedFrameWidth] != cameraPosition)) transformedX = transformedY = 0; else cameraToScreenSpace(transformedX,transformedY,screenPoints,cameraPoints,triangles); if (transformedX >= cameraFramesWidth[cameraPosition]) transformedX=cameraFramesWidth[cameraPosition]-1; if (transformedY >= cameraFramesHeight[cameraPosition]) transformedY = cameraFramesHeight[cameraPosition]-1; cameraOffsetMap[T] = transformedX+transformedY*cameraFramesWidth[cameraPosition]; T++; } } free(screenPoints); free(cameraPoints); free(triangles); }