2016-05-23 10 views
0

Ich versuche, einen Beispielcode von OpenCV für PCA von diesem Link PCA example ausführen.Fehler mit PCA in OpenCV 3

Aber nachdem ich es laufen bricht es zusammen. Ich gedebuggt und ich sah, dass es im Inneren unter for loop bricht, die in getOrientation Funktion ist:

for (int i = 0; i < 2; ++i) 
{ 
    eigen_vecs[i] = Point2d(pca_analysis.eigenvectors.at<double>(i, 0), 
     pca_analysis.eigenvectors.at<double>(i, 1)); 
    eigen_val[i] = pca_analysis.eigenvalues.at<double>(0, i); 
} 

ich vor in Stackoverflow gesucht, es gab Fragen mit einem ähnlichen Titel, aber nicht den gleichen Fehler. Irgendeine Hilfe? Dank

Hier ist der Beispielcode:

#include <iostream> 
#include <opencv2/opencv.hpp> 
using namespace std; 
using namespace cv; 

// Function declarations 
void drawAxis(Mat&, Point, Point, Scalar, const float); 
double getOrientation(const vector<Point> &, Mat&); 
void drawAxis(Mat& img, Point p, Point q, Scalar colour, const float scale = 0.2) 
{ 
    double angle; 
    double hypotenuse; 
    angle = atan2((double)p.y - q.y, (double)p.x - q.x); // angle in radians 
    hypotenuse = sqrt((double)(p.y - q.y) * (p.y - q.y) + (p.x - q.x) * (p.x - q.x)); 
    // double degrees = angle * 180/CV_PI; // convert radians to degrees (0-180 range) 
    // cout << "Degrees: " << abs(degrees - 180) << endl; // angle in 0-360 degrees range 
    // Here we lengthen the arrow by a factor of scale 
    q.x = (int)(p.x - scale * hypotenuse * cos(angle)); 
    q.y = (int)(p.y - scale * hypotenuse * sin(angle)); 
    line(img, p, q, colour, 1, CV_AA); 
    // create the arrow hooks 
    p.x = (int)(q.x + 9 * cos(angle + CV_PI/4)); 
    p.y = (int)(q.y + 9 * sin(angle + CV_PI/4)); 
    line(img, p, q, colour, 1, CV_AA); 
    p.x = (int)(q.x + 9 * cos(angle - CV_PI/4)); 
    p.y = (int)(q.y + 9 * sin(angle - CV_PI/4)); 
    line(img, p, q, colour, 1, CV_AA); 
} 
double getOrientation(const vector<Point> &pts, Mat &img) 
{ 
    //Construct a buffer used by the pca analysis 
    int sz = static_cast<int>(pts.size()); 
    Mat data_pts = Mat(sz, 2, CV_64FC1); 
    for (int i = 0; i < data_pts.rows; ++i) 
    { 
     data_pts.at<double>(i, 0) = pts[i].x; 
     data_pts.at<double>(i, 1) = pts[i].y; 
    } 
    //Perform PCA analysis 
    PCA pca_analysis(data_pts, Mat(), CV_PCA_DATA_AS_ROW); 
    //Store the center of the object 
    Point cntr = Point(static_cast<int>(pca_analysis.mean.at<double>(0, 0)), 
     static_cast<int>(pca_analysis.mean.at<double>(0, 1))); 
    //Store the eigenvalues and eigenvectors 
    vector<Point2d> eigen_vecs(2); 
    vector<double> eigen_val(2); 
    *for (int i = 0; i < 2; ++i) 
    { 
     eigen_vecs[i] = Point2d(pca_analysis.eigenvectors.at<double>(i, 0), 
      pca_analysis.eigenvectors.at<double>(i, 1)); 
     eigen_val[i] = pca_analysis.eigenvalues.at<double>(0, i); 
    }* 
    // Draw the principal components 
    circle(img, cntr, 3, Scalar(255, 0, 255), 2); 
    Point p1 = cntr + 0.02 * Point(static_cast<int>(eigen_vecs[0].x * eigen_val[0]), static_cast<int>(eigen_vecs[0].y * eigen_val[0])); 
    Point p2 = cntr - 0.02 * Point(static_cast<int>(eigen_vecs[1].x * eigen_val[1]), static_cast<int>(eigen_vecs[1].y * eigen_val[1])); 
    drawAxis(img, cntr, p1, Scalar(0, 255, 0), 1); 
    drawAxis(img, cntr, p2, Scalar(255, 255, 0), 5); 
    double angle = atan2(eigen_vecs[0].y, eigen_vecs[0].x); // orientation in radians 
    return angle; 
} 
int main(int, char** argv) 
{ 
    // Load image 
    Mat src = imread("C:/Users/aydin/Desktop/c++/pictures/pca_test1.jpg"); 
    //Mat src = imread(argv[1]); 
    // Check if image is loaded successfully 
    if (!src.data || src.empty()) 
    { 
     cout << "Problem loading image!!!" << endl; 
     return EXIT_FAILURE; 
    } 
    imshow("src", src); 
    // Convert image to grayscale 
    Mat gray; 
    cvtColor(src, gray, COLOR_BGR2GRAY); 
    // Convert image to binary 
    Mat bw; 
    threshold(gray, bw, 50, 255, CV_THRESH_BINARY | CV_THRESH_OTSU); 
    // Find all the contours in the thresholded image 
    vector<Vec4i> hierarchy; 
    vector<vector<Point> > contours; 
    findContours(bw, contours, hierarchy, CV_RETR_LIST, CV_CHAIN_APPROX_NONE); 
    for (size_t i = 0; i < contours.size(); ++i) 
    { 
     // Calculate the area of each contour 
     double area = contourArea(contours[i]); 
     // Ignore contours that are too small or too large 
     if (area < 1e2 || 1e5 < area) continue; 
     // Draw each contour only for visualisation purposes 
     drawContours(src, contours, static_cast<int>(i), Scalar(0, 0, 255), 2, 8, hierarchy, 0); 
     // Find the orientation of each shape 
     //getOrientation(contours[i], src); 
    } 
    imshow("output", src); 
    waitKey(0); 
    return 0; 
} 
+0

Ich habe versucht, den Code im Beispiel auszuführen, und es ist wie erwartet ausgegeben. Was ist dein Compiler und andere Umgebung? –

+0

Ich benutze opencv 3 und Visual Studio 2015 auf Windows 10. und wenn ich "getOrientation" Funktion kommen funktioniert es richtig und zeigt Bilder mit Zählern aber nicht natürlich – Aydin

+0

Versuchen Sie, neu zu starten) Ich denke, das Problem ist irgendwo in Ihrer Umgebung. Dieser Code funktioniert wie erwartet. Es gibt nicht genügend Informationen, um Ihnen zu helfen. –

Antwort

1

Nein, es geht nicht um Umwelt ist, ich weiß nicht, wie Sie es vielleicht funktionieren, aber danach sah ich denselben Fehler here und er hat die richtige Code sagt, dass es bugs.however vergleicht diesen Code hatte ich mit Original sah, dass in "for-Schleife", die ich

for (int i = 0; i < 2; ++i) 
    { 
     eigen_vecs[i] = Point2d(pca_analysis.eigenvectors.at<double>(i, 0), 
           pca_analysis.eigenvectors.at<double>(i, 1)); 

     eigen_val[i] = pca_analysis.eigenvalues.at<double>(0,i); 
    } 

als problematisch erwähnt, er letzte geklam- mert von (0, i) bis (i) geändert. Ich tat das Gleiche und es funktionierte, aber ich verstehe nicht warum, kannst du mir sagen warum?