2012-04-02 1 views
0

Ich möchte den Schwerpunkt jeder Kontur finden.für das nehme ich einige Beispielcode und teste es..ich habe ein Problem mit dieser Codierung.Ich habe einen Fehler .. .Bitte helfen mir, dass ... diese sehr nützlich für mich ... Vielen Dank im Voraus zu lösen ... ich benutze Windows-Plattform mit Visual Studio 2008Ich habe prob mit dieser Codierung verwandt, um die Konturen zu finden

#include <cv.h> 
#include <highgui.h> 
#include <iostream> 
#include <stdio.h> 
#include <stdlib.h> 

using namespace cv; 
using namespace std; 

Mat src; 
Mat src_gray; 
int thresh = 100; 
int max_thresh = 255; 
RNG rng(12345); 

/// Function header 
void thresh_callback(int, void*); 

/** @function main */ 
int main(int argc, char** argv) 
{ 
    /// Load source image and convert it to gray 
    IplImage* src = cvLoadImage("TEST2.jpg"); 

    /// Convert image to gray and blur it 
    cvtColor(src, src_gray, CV_BGR2GRAY); 
    blur(src_gray, src_gray, Size(3,3)); 

    /// Create Window 
    char* source_window = "Source"; 
    namedWindow(source_window, CV_WINDOW_AUTOSIZE); 
    imshow(source_window, src); 

    createTrackbar("Canny thresh:","Source", &thresh, max_thresh, thresh_callback); 
    thresh_callback(0,0); 

    waitKey(0); 
    return(0); 
} 

/** @function thresh_callback */ 
void thresh_callback(int, void*) 
{ 
    Mat canny_output; 
    vector<vector<Point>> contours; 
    vector<Vec4i> hierarchy; 

    /// Detect edges using canny 
    Canny(src_gray, canny_output, thresh,thresh*2,3); 
    /// Find contours 
    findContours(canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0)); 

    /// Get the moments 
    vector<Moments> mu(contours.size()); 
    for(int i = 0; i < contours.size(); i++) 
    { 
    mu[i] = moments(contours[i], false); 
    } 

    /// Get the mass centers: 
    vector<Point2f> mc(contours.size()); 
    for(int i = 0; i < contours.size(); i++) 
    { 
    mc[i] = Point2f(mu[i].m10/mu[i].m00 , mu[i].m01/mu[i].m00); 
    } 

    /// Draw contours 
    Mat drawing = Mat::zeros(canny_output.size(), CV_8UC3); 
    for(int i = 0; i< contours.size(); i++) 
    { 
     Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255)); 
     drawContours(drawing, contours, i, color, 2, 8, hierarchy, 0, Point()); 
     circle(drawing, mc[i], 4, color, -1, 8, 0); 
    } 

    /// Show in a window 
    namedWindow("Contours", CV_WINDOW_AUTOSIZE); 
    imshow("Contours", drawing); 

    /// Calculate the area with the moments 00 and compare with the result of the OpenCV function 
    printf("\t Info: Area and Contour Length \n"); 
    for(int i = 0; i< contours.size(); i++) 
    { 
     printf(" * Contour[%d] - Area (M_00) = %.2f - Area OpenCV: %.2f - Length: %.2f \n", i, mu[i].m00, contourArea(contours[i]), arcLength(contours[i], true)); 
     Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255)); 
     drawContours(drawing, contours, i, color, 2, 8, hierarchy, 0, Point()); 
     circle(drawing, mc[i], 4, color, -1, 8, 0); 
    } 



} 

Der Fehler lik ...

Error 2 error C2664: 'cv::moments' : cannot convert parameter 1 from 'std::vector<_Ty>' to 'const cv::Mat &' d:\aranga_try\new_opencv\new_opencv\auto_focustest.cpp 57 New_opencv 
    Error 8 error C2664: 'cv::contourArea' : cannot convert parameter 1 from 'std::vector<_Ty>' to 'const cv::Mat &' d:\aranga_try\new_opencv\new_opencv\auto_focustest.cpp 84 New_opencv 
    Error 9 error C2664: 'cv::arcLength' : cannot convert parameter 1 from 'std::vector<_Ty>' to 'const cv::Mat &' d:\aranga_try\new_opencv\new_opencv\auto_focustest.cpp 84 New_opencv 
+0

Welche Version von OpenCV verwenden Sie? Nachdem ich 'IplImage * src = cvLoadImage (" TEST2.jpg ") geändert habe;' zu 'Mat src = imread (" TEST2.jpg ");' und 'vector > Konturen;' zu 'Vektor > Konturen; 'Ihr Beispiel kompiliert fehlerfrei mit OpenCV 2.3.1. – sietschie

+0

Ich benutze OpenCV 2.1.0 .... Aber ich habe den gleichen Fehler nach der Korrektur auch ... – aranga

Antwort

1

Sie müssen std::vector<cv::Point> explizit in cv::Mat umwandeln, indem Sie

aufrufen
template<typename _Tp> explicit Mat(const vector<_Tp>& vec, bool copyData=false); 

Nachdem Sie die Matrix erhalten haben, können Sie Momente, Fläche oder Umfang berechnen. Zum Beispiel, um Bereich zu berechnen:

double area = cv::contourArea(cv::Mat(contours[i], false)); 
+0

Got it..Danke ... – aranga

Verwandte Themen