Exemplo n.º 1
0
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();
}
Exemplo n.º 2
0
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();
}
Exemplo n.º 3
0
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;
	}
}