OpenCV中的点问题

时间:2013-07-08 15:38:25

标签: c++ opencv

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

  1. 实时拼接两个网络摄像头图像。

  2. 执行背景减法并从结果前景Mat计算轮廓的典型矢量。

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

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

  5. 我可以通过测试确认并看到结果#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缩放?

    谢谢,

    托尼

1 个答案:

答案 0 :(得分:1)

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

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