2016-11-08 1 views
0

Ich bin relativ neu zu opencv und C++ und ich möchte etwas Hilfe auf meinem Code. Für mein Projekt arbeite ich gerade an einem einfachen Blob-Detektor, aber wenn ich es ausführe, bekomme ich "OpenCV Error: Bad-Flag (Parameter oder Strukturfeld) (Unbekannter oder nicht unterstützter Array-Typ) in cvGetMat, Datei C: \ Builds \ master_PackSlave-win64-vc12-shared \ opencv \ modules \ core \ src \ array.cpp, Zeile 2494 Drücken Sie eine beliebige Taste, um fortzufahren.. Ich bin ziemlich sicher, dass der Fehler entweder von der Mat im_with_keypoints; oder ein Problem in Linker ist. Unten ist mein Code. Wenn du mir helfen könntest, wäre das großartig.Bad Flag Fehler in opencv 3.0

  • Update: lief ich dieses Programm durch den Debugger und kam mit diesem Fehler aus
    • ich auch Visual Studio 2015

Dies ist das Bild, das ich versuche, bin mit Erkennung für Blobs:

Picture is of 5 coins (eagle coins to be specific)

#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/features2d.hpp" 
#include "opencv2/opencv.hpp" 
#include <opencv2/core/core.hpp> 

using namespace cv; 
using namespace std; 

int main(int argc, char** argv) 
{ 


    Mat im = imread("Eagle_coins.jpg", IMREAD_GRAYSCALE); 


    SimpleBlobDetector::Params params; 

    params.minThreshold = 10; 
    params.maxThreshold = 200; 

    params.filterByColor = true; 

    params.filterByCircularity = true; 
    params.minCircularity = 0.1; 
    params.maxCircularity = 0.28; 


    params.filterByConvexity = true; 
    params.minConvexity = 0.87; 
    params.maxConvexity = 2.8; 


    params.filterByInertia = true; 
    params.minInertiaRatio = 0.01; 
    params.maxInertiaRatio = 2; 

    vector<KeyPoint> keypoints; 

    Ptr<SimpleBlobDetector> detector = SimpleBlobDetector::create(params); 

    detector->detect(im, keypoints); 

    Mat im_with_keypoints; 
    drawKeypoints(im, keypoints, im_with_keypoints, Scalar(0, 0, 255),      DrawMatchesFlags::DRAW_RICH_KEYPOINTS); 

    imshow("white", im_with_keypoints); 
    waitKey(0); 

} 
+0

Haben Sie versucht, es im Debugger auszuführen? Was hat dir das gesagt? Es gibt keine Notwendigkeit zu erraten. –

+0

@Dan Mašek Ich lief das Programm über den Debugger und kam mit dem Laufzeitfehler –

+0

Sie sollten in der Lage sein, auf den Debugger zu brechen, wenn der Fehler auftritt, und überprüfen Sie die Stack-Ablaufverfolgung, um zu sehen, wo genau das in Ihrem Code geschieht.Dann können Sie den Debugger verwenden, um die Argumente für das, was Sie aufrufen, weiter zu untersuchen, die fehlschlagen, um mehr Einblick in das Problem zu bekommen. | Es wäre nützlich, wenn Sie eine Kopie Ihres Eingabebildes anhängen, damit andere es reproduzieren können. | Eine weitere Sache, die Sie erwähnen können, ist, in welchem ​​Modus Sie Ihr Programm kompiliert haben (Debug oder Release?) Und welche Bibliotheken (die Namen) Sie damit verlinkt haben. –

Antwort

0

Der minimale Code, der Fehler Sie sieht erwähnen wiedergibt, wie folgt:

#include <opencv2/opencv.hpp> 
#include <opencv2/features2d.hpp> 
#include <opencv2/highgui/highgui.hpp> 

int main(int argc, char** argv) 
{ 
    cv::Mat im; 

    cv::SimpleBlobDetector::Params params; 
    std::vector<cv::KeyPoint> keypoints; 
    cv::Ptr<cv::SimpleBlobDetector> detector = cv::SimpleBlobDetector::create(params); 
    detector->detect(im, keypoints); 
} 

Konsole enthält

OpenCV Error: Bad flag (parameter or structure field) (Unrecognized or unsupported array type) in cvGetMat, file C:\builds\master_PackSlave-win64-vc12-shared\opencv\modules\core\src\array.cpp, line 2494

und ich eine Ausnahme von detector->detect mit der Nachricht erhalten

Unhandled exception at 0x00007FF9A88C7788 in so03.exe: Microsoft C++ exception: cv::Exception at memory location 0x0000005BA676E230.

Hinweis: Die Quelle des Fehlers wäre viel deutlicher im Debugger, wenn Sie die Debug-Symbole (PDB) für die Bibliothek zur Verfügung hätten. Leider enthält das Paket mit vorkompilierten Binaries, die von der OpenCV-Site vertrieben werden, diese nicht, weshalb ich es vorziehe, meine eigenen zu bauen.

Es geht weg, wenn wir eine nicht leere cv::Mat-detect passieren:

#include <opencv2/opencv.hpp> 
#include <opencv2/features2d.hpp> 
#include <opencv2/highgui/highgui.hpp> 

int main(int argc, char** argv) 
{ 
    cv::Mat im(100, 100, CV_8UC3); 

    cv::SimpleBlobDetector::Params params; 
    std::vector<cv::KeyPoint> keypoints; 
    cv::Ptr<cv::SimpleBlobDetector> detector = cv::SimpleBlobDetector::create(params); 
    detector->detect(im, keypoints); 
} 

Daraus schließen wir, können, dass in Ihrem Beispiel imread das Bild nicht geladen werden kann. Dies ist durchaus möglich, da Sie diese Situation nicht überprüfen.

so etwas wie diese direkt nach dem Aufruf imread hinzufügen:

if (im.empty()) { 
    std::cerr << "Failed to load image.\n"; 
    return -1; 
} 

Nun, warum das Bild richtig Laden nicht. Eine Option, da Sie Visual Studio verwenden, ist, dass Sie Ihr Arbeitsverzeichnis nicht korrekt eingerichtet haben - standardmäßig befindet sich hier die Projektdatei, die sich wahrscheinlich nicht in der exe befindet. Setzen Sie entweder Debugging > Working Directory in den Eigenschaften Ihres Projekts oder verwenden Sie einen absoluten Pfad, um das Bild zu laden.

+0

Das schien mein Problem zu lösen. Vielen Dank! –

+0

Kein Problem. Wenn Sie der Meinung sind, dass dies Ihre Frage angemessen beantwortet, können Sie es als akzeptiert markieren und es möglicherweise verbessern. (Es sind diese zwei Pfeile und was ich denke, ist ein Häkchen oben links in der Antwort). –