2013-07-08 76 views
0

點我有一些OpenCV的代碼中的小bug,嘗試做如下:麻煩與OpenCV的

  1. 針2個的攝像頭圖像一起實時。

  2. 執行背景減法並從所得到的前景Mat計算典型的輪廓矢量。

  3. 從輪廓矢量中計算出表示物體在圖像中的位置的點。它可能只是質心,但我在所有邊界框的底部邊緣上使用中心點。這在「最低點」功能中完成。

  4. 轉移這些點到一個新的座標系,這大致接近,只是範圍縮小或到新的圖像大小,但在未來它可能是任何東西。這在「tf」功能中完成。

我可以從測試中看出結果#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)在主

打印爲 'Object' 點...

點0:(0,340) 點1:(0,261)

爲什麼x座標總是0,爲什麼是Y座標不被用b縮放?

感謝,

託尼

+0

你確定你的乘數'a'是否爲非零?如果你在'tf'函數內打印出'a'和'b'的值,它們會顯示什麼? – aardvarkk

回答

1

我的猜測是,你有一個整數除法問題。默認情況下,C++會假定當你使用整數除法運算符時,實際上需要整數除法。在你的情況下,你可能不會。試試這個:

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

釘了它,非常感謝! – TonyRo