2017-05-20 10 views
0

フリーマンチェーンコードを画像の特徴抽出として使用しています。 イメージを読み取ることができません。チェーンコードxmlファイルを取得する必要があります。 チェーンコードxmlファイルを取得して保存するにはどうすればよいですか? は、以下のコードが実行をされているときはいつでも、私は私が間違ったフォーマットを使用し、このerror.Haveを抱えている。..OpenCV 3.0でチェーンコードxmlファイルを入手する方法

#include "opencv2/imgproc.hpp" 
#include "opencv2/highgui.hpp" 
#include "opencv2/imgproc/imgproc_c.h" 
#include <iostream> 
#include <opencv2/core.hpp> 
#include <opencv2/opencv.hpp> 
#include "opencv2/imgcodecs.hpp" 
#include <opencv2/highgui.hpp> 
#include <opencv2/ml.hpp> 
#include <fstream> 
#include<string.h> 

using namespace std; 
using namespace cv; 

int main() { 

    Mat img = imread("test.jpg") 
    imshow("Test", img); 


    vector<vector<Point>> contours; // Vector for storing contour 
    vector<Vec4i> hierarchy; 


    cv::findContours(img, contours, RETR_EXTERNAL,CV_CHAIN_CODE); 

    cout << Mat(contours[0]) << endl; 

    findContours(img, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE); 
    cout << "CHAIN_APPROX_SIMPLE" << endl; 
    cout << Mat(contours[0]) << endl; 

    CvChain* chain = 0; 
    CvMemStorage* storage = 0; 
    storage = cvCreateMemStorage(); 
    cvFindContours(&IplImage(img), storage, (CvSeq**)(&chain), sizeof(*chain), CV_RETR_TREE, CV_CHAIN_CODE); 
    int total = chain->total; 

    cv::Mat hist(1, 8, CV_32F, Scalar(0)); 

    int totalCount = 0; 

    for (; chain != NULL; chain = (CvChain*)chain->h_next) 
    { 
     int numChain = 0; 

     CvSeqReader reader; 
     int i, total = chain->total; 
     cvStartReadSeq((CvSeq*)chain, &reader, 0); 
     cout<<"--------------------chain\n"; 

     for (i = 0; i<total; i++) 
     { 
      char code; 
      CV_READ_SEQ_ELEM(code, reader); 
      int Fchain = (int)code; 

      hist.at<float>(0, Fchain)++; 

      totalCount++; 

      cout<<"%d"<<code; 
     } 
    } 
    Mat prob = hist/totalCount; 
    cout << prob << endl; 

    waitKey(0); 

    return 0; 
} 

誰かが助けることができるOpenCVの3.0 の私のC++コードである??誰でも助けてくれますか?

OpenCV Error: Unsupported format or combination of formats ([Start]FindContours supports only CV_8UC1 images when mode != CV_RETR_FLOODFILL otherwise supports CV_32SC1 images only) in cvStartFindContours, file C:\buildslave64\win64_amdocl\master_PackSlave-win64-vc14-shared\opencv\modules\imgproc\src\contours.cpp, line 198 

私のコードを更新しました。私はXMLファイルを保存できますが、データは1行しか取得できません。

#include "opencv2/imgproc.hpp" 
#include "opencv2/highgui.hpp" 
#include "opencv2/imgproc/imgproc_c.h" 
#include <iostream> 
#include <opencv2/core.hpp> 
#include <opencv2/opencv.hpp> 
#include "opencv2/imgcodecs.hpp" 
#include <opencv2/highgui.hpp> 
#include <opencv2/ml.hpp> 
#include <fstream> 
#include<string.h> 

using namespace std; 
using namespace cv; 

vector<String> files; 
int main() { 


    double totalCount = 0; 
    cv::glob("C:/Users//Videos/Database/Frames/*.jpg", files); 
    for (size_t i = 0; i < files.size(); i++) { 
     Mat image = imread(files[i]); 

     //Mat image = imread("Outline.jpg"); 

     Canny(image, image, 100, 100 * 2, 3, false); 

     CvChain* chain; 
     CvMemStorage* storage = 0; 
     storage = cvCreateMemStorage(); 

     cvFindContours(&IplImage(image), storage, (CvSeq**)(&chain), sizeof(*chain), CV_RETR_EXTERNAL, CV_CHAIN_CODE); 

     int total = chain->total; 


     // 1 row, 8 cols, filled with zeros, (float type, because we want to normalize later): 
     cv::Mat hist(1, 8, CV_32F, Scalar(0)); 

     for (; chain != NULL; chain = (CvChain*)chain->h_next) 
     { 
      CvSeqReader reader; 
      int i, total = chain->total; 

      cvStartReadSeq((CvSeq*)chain, &reader, 0); 

      for (i = 0; i < total; i++) 
      { 
       char code; 
       CV_READ_SEQ_ELEM(code, reader); 
       int Fchain = (int)code; 

       // increase the counter for the respective bin: 
       hist.at<float>(0, Fchain)++; 

       totalCount++; 
      } 
     } 

     // print the raw histogram: 
     cout << "Histo: " << hist << endl; 
     cout << "Total: " << totalCount << endl; 

     // normalize it: 
     Mat prob = hist/totalCount; 
     cout << "Proba: " << prob << endl; 

     FileStorage fs("freeman.xml", FileStorage::WRITE); 
     fs << "chain" << prob; 
     waitKey(0); 
     return 0; 
    } 
} 

以下に示すように、私はthis.Whatのような私のチェーンコードxmlを持っていますか?誰も私を助けることができますか?

<?xml version="1.0"?> 
<opencv_storage> 
<chain type_id="opencv-matrix"> 
    <rows>1</rows> 
    <cols>8</cols> 
    <dt>f</dt> 
    <data> 
    5.00000000e-01 0. 0. 0. 5.00000000e-01 0. 0. 0.</data></chain> 
</opencv_storage> 

答えて

0

エラーメッセージには、何が間違っているのかが正確に明白に示されています。読むだけで十分です。 CV :: findContours()あなたはCV_RETR_FLOODFILLモードを使用する場合CV_8UC1ピクセルタイプのみCV_32SC1の画像のみを受け付けます。あなたの特別な場合は、ロード後にimgオブジェクトをCV_8UC1に変換する必要があります。おそらくRGBイメージをロードしています。

+0

ありがとうございます@KjMag – Allison

+0

問題ありません。それがあなたを助けたならば、あなたはこの回答をアップヴォートしたり受け入れたりするかもしれません。 – KjMag

関連する問題