我在一些OpenCV代码中有一个小错误,试图执行以下操作:
实时拼接两个网络摄像头图像。
执行背景减法并从结果前景Mat计算轮廓的典型矢量。
从轮廓矢量中,计算表示对象在图像中的位置的点。它可能只是质心,但我正在使用所有边界框底边的中心点。这是在函数“lowestPoints”中完成的。
将这些点转移到一个新的坐标系中,该坐标系大致近似于将它们缩小或缩小到新的图像大小,但将来它可能是任何东西。这是在函数“tf”中完成的。
我可以通过测试确认并看到结果#1-3的工作正常。出于某种原因,#4根本无法正常工作。新计算的坐标始终具有零x分量,y分量根本不会缩放。当我绘制它们或cout坐标时,它总是为零,并且总是绘制在新图像的左侧。相关代码如下:
//from transfunc.cpp
#include <opencv2/opencv.hpp>
#include <vector>
#include "defines.h"
#include "protos.h"
vector<Point> lowestPoints(vector<vector<Point>> contours)
{
// Returns the midpoints of the bottom edge of contour bounding boxes
Point p;
Rect box;
vector<Point> lowPoints;
for (unsigned int i = 0; i < contours.size(); i++)
{
box = boundingRect(contours[i]);
p.x = box.x + box.width/2;
p.y = box.y + box.height;
lowPoints.push_back(p);
}
return lowPoints;
}
vector<Point> tf(vector<Point> in, vector<Point> grid, Mat camImg, Mat layoutImg)
{
int a, b;
Point temp;
vector<Point> out;
std::cout << "Points set in to TF..." << std::endl << std::endl;
printPoints(in);
a = layoutImg.cols / camImg.cols;
b = layoutImg.rows / camImg.rows;
for (unsigned int i = 0; i < in.size(); i++)
{
temp.x = in[i].x * a;
temp.y = in[i].y * b;
out.push_back(temp);
}
std::cout << "Points calculated in TF..." << std::endl << std::endl;
printPoints(out);
return out;
}
// from main.cpp
#include <opencv2/opencv.hpp>
#include <iostream>
#include <vector>
#include "defines.h"
#include "protos.h"
int main()
{
//variable declarations and initializations
while(true) //main webcam feed loop
{
// First time through calculate necessary camera parameters for stitching
// Grab frames from videoCaptures
// Stitch the frames together (stored in Mat pano)
// Background subtraction + calculate vector<vector<Point>> contours
if (contours.size() > 0)
{
drawBoundingBoxes(contours, pano);
lowPoints = lowestPoints(contours);
objPoints = tf(lowPoint, pano, topDown);
// Draw everything
std::cout << "Printing 'Lowest' Points in main..." << std::endl;
printPoints(lowestPoints(contours));
std::cout << "Printing 'Object' Points in main..." << std::endl;
printPoints(objPoints);
}
// Show images
}
return 0;
}
采样点的输出如下所示:
点数发送到TF ...
第0点:(509,340) 第1点:(477,261)
以TF计算的点...
第0点:(0,340) 第1点:(0,261)
打印主要的“最低”点...
第0点:(509,340) 第1点:(477,261)
在主...中打印'对象'点
第0点:(0,340) 第1点:(0,261)
为什么x坐标总是为零,为什么y坐标没有被b缩放?
谢谢,
托尼
答案 0 :(得分:1)
我的猜测是你有一个整数除法问题。默认情况下,C ++会假设当你使用带有整数的除法运算符时,你实际上需要整数除法。在你的情况下,你可能不会。试试这个:
double a = static_cast<double>(layoutImg.cols) / camImg.cols;
double b = static_cast<double>(layoutImg.rows) / camImg.rows;