gpt4 book ai didi

c++ - OpenCV 中的点问题

转载 作者:行者123 更新时间:2023-11-28 07:31:47 26 4
gpt4 key购买 nike

我在一些尝试执行以下操作的 OpenCV 代码中有一个小错误:

  1. 实时将两个网络摄像头图像拼接在一起。

  2. 执行背景减法,并从得到的前景 Mat 中计算轮廓的典型 vector 。

  3. 根据轮廓 vector ,计算表示对象在图像中的位置的点。它可能只是质心,但我使用的是所有边界框底部边缘的中心点。这是在函数“lowestPoints”中完成的。

  4. 将这些点转移到一个新的坐标系中,这大致类似于将它们缩小或放大到新的图像大小,但在未来它可以是任何东西。这是在函数“tf”中完成的。

我可以通过测试和查看结果确认#'s 1-3 工作正常。出于某种原因,#4 根本无法正常工作。新计算的坐标始终具有零 x 分量,而 y 分量根本不缩放。当我绘制它们或计算坐标时,它始终为零,并且始终绘制在新图像的左侧。相关代码如下:

//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 缩放?

谢谢,

-托尼

最佳答案

我的猜测是您遇到了整数除法问题。默认情况下,C++ 会假定当您对整数使用除法运算符时,您实际上需要整数除法。在你的情况下,你可能不会。试试这个:

double a = static_cast<double>(layoutImg.cols) / camImg.cols;
double b = static_cast<double>(layoutImg.rows) / camImg.rows;

关于c++ - OpenCV 中的点问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17530633/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com