void ccRenderingTools::ShowDepthBuffer(ccGBLSensor* sensor, QWidget* parent) { if (!sensor) return; const ccGBLSensor::DepthBuffer& depthBuffer = sensor->getDepthBuffer(); if (!depthBuffer.zBuff) return; //determine min and max depths ScalarType minDist = 0, maxDist = 0; { const ScalarType *_zBuff = depthBuffer.zBuff; for (int x=0; x<depthBuffer.height*depthBuffer.width; ++x,++_zBuff) { if (x==0) { maxDist = minDist = *_zBuff; } else if (*_zBuff > 0) { maxDist = std::max(maxDist,*_zBuff); minDist = std::min(minDist,*_zBuff); } } } QImage bufferImage(depthBuffer.width,depthBuffer.height,QImage::Format_RGB32); { ccColorScale::Shared colorScale = ccColorScalesManager::GetDefaultScale(); assert(colorScale); ScalarType coef = maxDist-minDist < ZERO_TOLERANCE ? 0 : static_cast<ScalarType>(ccColorScale::MAX_STEPS-1)/(maxDist-minDist); const ScalarType* _zBuff = depthBuffer.zBuff; for (int y=0; y<depthBuffer.height; ++y) { for (int x=0; x<depthBuffer.width; ++x,++_zBuff) { const colorType* col = (*_zBuff >= minDist ? colorScale->getColorByIndex(static_cast<unsigned>((*_zBuff-minDist)*coef)) : ccColor::black); bufferImage.setPixel(x,depthBuffer.height-1-y,qRgb(col[0],col[1],col[2])); } } } QDialog* dlg = new QDialog(parent); dlg->setWindowTitle(QString("%0 depth buffer [%1 x %2]").arg(sensor->getParent()->getName()).arg(depthBuffer.width).arg(depthBuffer.height)); dlg->setFixedSize(bufferImage.size()); QVBoxLayout* vboxLayout = new QVBoxLayout(dlg); vboxLayout->setContentsMargins(0,0,0,0); QLabel* label = new QLabel(dlg); label->setScaledContents(true); vboxLayout->addWidget(label); label->setPixmap(QPixmap::fromImage(bufferImage)); dlg->show(); }
void ccRenderingTools::ShowDepthBuffer(ccGBLSensor* sensor, QWidget* parent/*=0*/, unsigned maxDim/*=1024*/) { if (!sensor) return; const ccGBLSensor::DepthBuffer& depthBuffer = sensor->getDepthBuffer(); if (depthBuffer.zBuff.empty()) return; //determine min and max depths ScalarType minDist = 0.0f; ScalarType maxDist = 0.0f; { const ScalarType* _zBuff = &(depthBuffer.zBuff.front()); double sumDist = 0.0; double sumDist2 = 0.0; unsigned count = 0; for (unsigned x=0; x<depthBuffer.height*depthBuffer.width; ++x,++_zBuff) { if (x == 0) { maxDist = minDist = *_zBuff; } else if (*_zBuff > 0) { maxDist = std::max(maxDist,*_zBuff); minDist = std::min(minDist,*_zBuff); } if (*_zBuff > 0) { sumDist += *_zBuff; sumDist2 += *_zBuff * *_zBuff; ++count; } } if (count) { double avg = sumDist / count; double stdDev = sqrt(fabs(sumDist2 / count - avg*avg)); //for better dynamics maxDist = std::min(maxDist, static_cast<ScalarType>(avg + 1.0 * stdDev)); } } QImage bufferImage(depthBuffer.width, depthBuffer.height, QImage::Format_RGB32); { ccColorScale::Shared colorScale = ccColorScalesManager::GetDefaultScale(); assert(colorScale); ScalarType coef = maxDist - minDist < ZERO_TOLERANCE ? 0 : static_cast<ScalarType>(ccColorScale::MAX_STEPS - 1) / (maxDist - minDist); const ScalarType* _zBuff = &(depthBuffer.zBuff.front()); for (unsigned y=0; y<depthBuffer.height; ++y) { for (unsigned x=0; x<depthBuffer.width; ++x,++_zBuff) { const ccColor::Rgba& col = (*_zBuff >= minDist ? colorScale->getColorByIndex(static_cast<unsigned>((std::min(maxDist,*_zBuff)-minDist)*coef)) : ccColor::black); bufferImage.setPixel(x, depthBuffer.height - 1 - y, qRgb(col.r, col.g, col.b)); } } } QDialog* dlg = new QDialog(parent); dlg->setWindowTitle(QString("%0 depth buffer [%1 x %2]").arg(sensor->getParent()->getName()).arg(depthBuffer.width).arg(depthBuffer.height)); unsigned maxDBDim = std::max<unsigned>(depthBuffer.width, depthBuffer.height); unsigned scale = 1; while (maxDBDim > maxDim) { maxDBDim >>= 1; scale <<= 1; } dlg->setFixedSize(bufferImage.size()/scale); QVBoxLayout* vboxLayout = new QVBoxLayout(dlg); vboxLayout->setContentsMargins(0,0,0,0); QLabel* label = new QLabel(dlg); label->setScaledContents(true); vboxLayout->addWidget(label); label->setPixmap(QPixmap::fromImage(bufferImage)); dlg->show(); }
cv::Mat cropImageBlackFrame(cv::Mat &img) { //TODO AntiShake *aux = AntiShake::getInstance(); // aux->displayWindow(img, "original"); Mat gray, thresh, bufferImage; cv::copyMakeBorder(img, bufferImage, 10, 10, 10, 10, BORDER_CONSTANT); // STEP 1: transform to grayscale if (bufferImage.type() != CV_8U) { cvtColor(bufferImage, gray, CV_RGB2GRAY); } else { bufferImage.copyTo(gray); } // STEP 2: threshold black frame from the scene cv::threshold(gray, thresh, 1, 255, cv::THRESH_BINARY); aux->displayWindow(thresh, "thresh"); // aux->displayWindow(gray, "gray"); // STEP 3: Detect image corners std::vector<cv::KeyPoint> kpts; cv::FAST(thresh, kpts, 50, false); cout << "==== kpts.size() " << kpts.size() << endl; if (kpts.size() > 0) { std::vector<cv::Point2f> corners, pointsX, pointsY; cv::KeyPoint::convert(kpts, pointsX); pointsX.push_back(Point2f(0, 0)); pointsX.push_back(Point2f(0, img.rows)); pointsX.push_back(Point2f(img.cols, 0)); pointsX.push_back(Point2f(img.cols, img.rows)); // STEP 4: gets only the local minimums for (unsigned int pVar = 0; pVar < pointsX.size(); ++pVar) { bool isNew = true; for (unsigned int cVar = 0; cVar < corners.size(); ++cVar) { if ((abs(pointsX[pVar].x - corners[cVar].x) < img.cols / 3) && (abs(pointsX[pVar].y - corners[cVar].y) < img.rows / 3)) { isNew = false; if (corners[cVar].x < img.cols / 2) { corners[cVar].x = max(corners[cVar].x, pointsX[pVar].x); } else { corners[cVar].x = min(corners[cVar].x, pointsX[pVar].x); } if (corners[cVar].y < img.rows / 2) { corners[cVar].y = max(corners[cVar].y, pointsX[pVar].y); } else { corners[cVar].y = min(corners[cVar].y, pointsX[pVar].y); } } } if (isNew) { corners.push_back(pointsX[pVar]); } } cout << endl; for (unsigned int var = 0; var < corners.size(); ++var) { cout << "==== CornersX (x, y) = " << corners[var].x << ", " << corners[var].y << endl; } cout << endl << endl; if (corners.size() != 4) { cout << "==== corners size != 4, corners.size = " << corners.size() << endl << endl << endl; return img; } else { // STEP 5: Order Values according to X and Y values pointsX = corners; pointsY = pointsX; std::sort(pointsX.begin(), pointsX.end(), SortOnX()); std::sort(pointsY.begin(), pointsY.end(), SortOnY()); cv::Point2f points[2]; points[0] = Point2f(pointsX[1].x, pointsY[1].y); points[1] = Point2f(pointsX[2].x, pointsY[2].y); cout << "points[0] (x,y) = (" << points[0].x << ", " << points[0].y << ")" << endl << "points[1] (x,y) = (" << points[1].x << ", " << points[1].y << ")" << endl << "(gray.cols, gray.rows) = (" << gray.cols << ", " << gray.rows << ")" << endl; if (points[0].x == 12 && points[0].y == 12 && (gray.cols - points[1].x == 20) && (gray.rows - points[1].y == 20)) { cout << "==== NO NEW VERTICES" << endl << endl << endl; return img; } else { cv::Mat markedImage, finalImage; bufferImage.copyTo(markedImage); // STEP 6: Draw Green Lines on image cv::rectangle(markedImage, points[0], points[1], cv::Scalar(0, 255, 0)); cv::Rect rect(points[0], points[1]); aux->displayWindow(markedImage, "markedImage"); // STEP 7: Crop black Edges From images bufferImage(rect).copyTo(finalImage); aux->displayWindow(finalImage, "secondCrop"); return finalImage; } } } else { return img; } }