void Raytracer::render( int width, int height, Point3D eye, Vector3D view, Vector3D up, double fov, std::string fileName ) { computeTransforms(_root); Matrix4x4 viewToWorld; _scrWidth = width; _scrHeight = height; double factor = (double(height)/2)/tan(fov*M_PI/360.0); initPixelBuffer(); viewToWorld = initInvViewMatrix(eye, view, up); // Construct a ray for each pixel. for (int i = 0; i < _scrHeight; i++) { for (int j = 0; j < _scrWidth; j++) { // Sets up ray origin and direction in view space, // image plane is at z = -1. Point3D origin(0., 0., 0.); Point3D imagePlane; imagePlane[0] = (-double(width)/2 + 0.5 + j)/factor; imagePlane[1] = (-double(height)/2 + 0.5 + i)/factor; imagePlane[2] = -1; // TODO: Convert ray to world space and call // shadeRay(ray) to generate pixel colour. // ray -> world space Point3D rayOriginWorld = viewToWorld * imagePlane; Vector3D rayDir = imagePlane - origin; Vector3D rayDirWorld = viewToWorld * rayDir; Ray3D ray; ray.origin = rayOriginWorld; ray.dir = rayDirWorld; ray.dir.normalize(); // pixel colour Colour col = shadeRay(ray); _rbuffer[i*width+j] = int(col[0]*255); _gbuffer[i*width+j] = int(col[1]*255); _bbuffer[i*width+j] = int(col[2]*255); } } flushPixelBuffer(fileName); }
void Raytracer::computeTransforms( SceneDagNode::Ptr node ) { SceneDagNode::Ptr childPtr; if (node->parent != nullptr) { node->modelToWorld = node->parent->modelToWorld*node->trans; node->worldToModel = node->invtrans*node->parent->worldToModel; } else { node->modelToWorld = node->trans; node->worldToModel = node->invtrans; } // Traverse the children. childPtr = node->child; while (childPtr != NULL) { computeTransforms(childPtr); childPtr = childPtr->next; } }
//处理无匹配区域 void FindRegionCorrespondence(const Mat& srcImg, const Mat& refImg, const vector<Point2i>& srcFeatures, const vector<Point2i>& refFeatures, const Mat& srcVisibility, const Mat& refVisibility, const vector<int>& srcLabels, const int& regionum, vector<int>& refLabels, string resultFolder) { vector<vector<Point2f>> srcFeaturesTab(regionum); vector<vector<Point2f>> refFeaturesTab(regionum); int sz = srcFeatures.size(); int width = srcImg.size().width; int height = srcImg.size().height; for (int i = 0; i < sz; ++i) { int index = srcFeatures[i].y * width + srcFeatures[i].x; int l = srcLabels[index]; srcFeaturesTab[l].push_back(srcFeatures[i]); refFeaturesTab[l].push_back(refFeatures[i]); } //保存无匹配区域 vector<int> unmatchedIdx(0); for (int i = 0; i < regionum; ++i) if (srcFeaturesTab[i].size() == 0) { unmatchedIdx.push_back(i); } vector<vector<Point2f>> d_srcPointsTab(regionum); calPointsTab(srcLabels, width, height, d_srcPointsTab); string fn; Mat unmatchedMsk = Mat::zeros(height, width, CV_8UC1), unmatched; cout << "unmatched regions: " << endl; for (int i = 0; i < unmatchedIdx.size(); ++i) { int idx = unmatchedIdx[i]; cout << idx << ' '; pointsToMask(d_srcPointsTab[idx], unmatchedMsk); } cout << endl; fn = resultFolder + "/unmatched_regions_mask.png"; imwrite(fn, unmatchedMsk); srcImg.copyTo(unmatched, unmatchedMsk); fn = resultFolder + "/unmatched_regions.png"; imwrite(fn, unmatched); //每个区域的像素点 vector<vector<Point2f>> srcPointsTab(regionum); //已知 vector<vector<Point2f>> refPointsTab(regionum); //未知 calPointsTab(srcLabels, srcVisibility, srcPointsTab); //每个区域只保留可见性为1的像素 //calPointsTab(srcLabels, width, height, srcPointsTab); vector<Mat> transforms(regionum); vector<int> isMatched(regionum); computeTransforms(srcFeaturesTab, refFeaturesTab, transforms, isMatched); //deal with unmatched region //cout << endl << "copy with no-matched region." << endl; dealUnMatchedRegion(isMatched, transforms); //dealUnMatchedRegion(srcImg, srcPointsTab, srcFeaturesTab, srcLabels, isMatched, transforms); //apply transform to each region applyTransforms(srcPointsTab, transforms, isMatched, refPointsTab); //求解refLabels computeRefLabels(refPointsTab, width, height, refVisibility, refLabels); }