35226
現在openCVでカメラキャリブレーションをしているのですが、デバッグエラーが検出されます。  
使っているのはopenCV2.4.11 Visual Studio 2015 Window10 です。  
プログラム内容は  
<http://opencv.jp/sample/camera_calibration.html>  
の一番上のコードを試させていただいているのですが、画像読み込み、コーナーの描写をした後、外部パラメータまで進むとデバッグエラーとなってしまいます。  
具体的には`CvMat sub_image_points, sub_object_points;`の部分です。

エラーは下のような文章が出ます。

> OpenCV Error: Assertion failed (_dst.fixedType()) in  
>  cv::convertPointsHomogeneous, file  
>  C:\buildslave64\win64_amdocl\master_PackSlave-
> win64-vc14-shared\opencv\modules\calib3d\src\fundam.cpp,  
>  line 1034

プログラムは初心者でどのように改善すればいいのか全くわかりません。お手数ですが回答の方お願いします。

変更した点として、include文を、

```

    #include "opencv2\opencv.hpp"
    #include "opencv2\imgproc\imgproc.hpp"
    #include "opencv2\objdetect\objdetect.hpp"
    #include "opencv2\highgui\highgui.hpp"
    #include "opencv2\calib3d\calib3d.hpp"
    #include "iostream"
    #include "iomanip"
    #include "stdio.h"
    #include "opencv\cv.h"
    #include "opencv\highgui.h"
    using namespace cv;
    using namespace std;
    
```

としています。おそらくいらない部分もあると思います 申し訳ございません。

```

    #include "opencv2\opencv.hpp"
    #include "opencv2\imgproc\imgproc.hpp"
    #include "opencv2\objdetect\objdetect.hpp"
    #include "opencv2\highgui\highgui.hpp"
    #include "opencv2\calib3d\calib3d.hpp"
    #include "iostream"
    #include "iomanip"
    #include "stdio.h"
    #include "opencv\cv.h"
    #include "opencv\highgui.h"
    
    using namespace cv;
    using namespace std;
    
    
    #define IMAGE_NUM  (1)         /* 画像数 */
    #define PAT_ROW    (7)          /* パターンの行数 */
    #define PAT_COL    (10)         /* パターンの列数 */
    #define PAT_SIZE   (PAT_ROW*PAT_COL)
    #define ALL_POINTS (IMAGE_NUM*PAT_SIZE)
    #define CHESS_SIZE (24.0)       /* パターン1マスの1辺サイズ[mm] */
    
    int
    main(int argc, char *argv[])
    {
    int i, j, k;
    int corner_count, found;
    int p_count[IMAGE_NUM];
    IplImage *src_img[IMAGE_NUM];
    CvSize pattern_size = cvSize(PAT_COL, PAT_ROW);
    CvPoint3D32f objects[ALL_POINTS];
    CvPoint2D32f *corners = (CvPoint2D32f *)cvAlloc(sizeof(CvPoint2D32f) * ALL_POINTS);
    CvMat object_points;
    CvMat image_points;
    CvMat point_counts;
    CvMat *intrinsic = cvCreateMat(3, 3, CV_32FC1);
    CvMat *rotation = cvCreateMat(1, 3, CV_32FC1);
    CvMat *translation = cvCreateMat(1, 3, CV_32FC1);
    CvMat *distortion = cvCreateMat(1, 4, CV_32FC1);
    
    // (1)キャリブレーション画像の読み込み
    for (i = 0; i < IMAGE_NUM; i++) {
        char buf[32];
        sprintf(buf, "calib_img/%02d.jpg", i);
        if ((src_img[i] = cvLoadImage(buf, CV_LOAD_IMAGE_COLOR)) == NULL) {
            fprintf(stderr, "cannot load image file : %s\n", buf);
        }
    }
    
    // (2)3次元空間座標の設定
    for (i = 0; i < IMAGE_NUM; i++) {
        for (j = 0; j < PAT_ROW; j++) {
            for (k = 0; k < PAT_COL; k++) {
                objects[i * PAT_SIZE + j * PAT_COL + k].x = j * CHESS_SIZE;
                objects[i * PAT_SIZE + j * PAT_COL + k].y = k * CHESS_SIZE;
                objects[i * PAT_SIZE + j * PAT_COL + k].z = 0.0;
            }
        }
    }
    cvInitMatHeader(&object_points, ALL_POINTS, 3, CV_32FC1, objects);
    
    // (3)チェスボード（キャリブレーションパターン）のコーナー検出
    int found_num = 0;
    cvNamedWindow("Calibration", CV_WINDOW_AUTOSIZE);
    for (i = 0; i < IMAGE_NUM; i++) {
        found = cvFindChessboardCorners(src_img[i], pattern_size, &corners[i * PAT_SIZE], &corner_count);
        fprintf(stderr, "%02d...", i);
        if (found) {
            fprintf(stderr, "ok\n");
            found_num++;
        }
        else {
            fprintf(stderr, "fail\n");
        }
        // (4)コーナー位置をサブピクセル精度に修正，描画
        IplImage *src_gray = cvCreateImage(cvGetSize(src_img[i]), IPL_DEPTH_8U, 1);
        cvCvtColor(src_img[i], src_gray, CV_BGR2GRAY);
        cvFindCornerSubPix(src_gray, &corners[i * PAT_SIZE], corner_count,
            cvSize(3, 3), cvSize(-1, -1), cvTermCriteria(CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 20, 0.03));
        cvDrawChessboardCorners(src_img[i], pattern_size, &corners[i * PAT_SIZE], corner_count, found);
        p_count[i] = corner_count;
        cvShowImage("Calibration", src_img[i]);
        cvWaitKey(0);
    }
    cvDestroyWindow("Calibration");
    
    if (found_num != IMAGE_NUM)
        return -1;
    cvInitMatHeader(&image_points, ALL_POINTS, 1, CV_32FC2, corners);
    cvInitMatHeader(&point_counts, IMAGE_NUM, 1, CV_32SC1, p_count);
    
    // (5)内部パラメータ，歪み係数の推定
    cvCalibrateCamera2(&object_points, &image_points, &point_counts, cvSize(1920, 1080), intrinsic, distortion);
    
    
    // (6)外部パラメータの推定
    CvMat sub_image_points, sub_object_points;
    int base = 0;
    cvGetRows (&image_points, &sub_image_points, base * PAT_SIZE, (base + 1) * PAT_SIZE);
    cvGetRows (&object_points, &sub_object_points, base * PAT_SIZE, (base + 1) * PAT_SIZE);
    cvFindExtrinsicCameraParams2(&sub_object_points, &sub_image_points, intrinsic, distortion, rotation, translation);
    
    // (7)XMLファイルへの書き出し
    CvFileStorage *fs;
    fs = cvOpenFileStorage("camera.xml", 0, CV_STORAGE_WRITE);
    cvWrite(fs, "intrinsic", intrinsic);
    cvWrite(fs, "rotation", rotation);
    cvWrite(fs, "translation", translation);
    cvWrite(fs, "distortion", distortion);
    cvReleaseFileStorage(&fs);
    
    for (i = 0; i < IMAGE_NUM; i++) {
        cvReleaseImage(&src_img[i]);
    }
    
    return 0;
    
```

}
CC BY-SA 3.0
2017-05-18T02:23:35.883
34798
2017-06-02T13:14:28.637
2017-05-18T02:55:46.560
3605
23081
question
visual-studio opencv
openCV　外部パラメータ検出の際エラーが出てしまいます
約1年前に別のサイトで全く同じ質問がされていますが、未解決のようです。  
<https://teratail.com/questions/34620>

バージョン違いによって発生する問題ということで、おそらく OpenCV のバグか仕様変更だと思います。  
そのサンプルは V1.x 用に書かれたものなので、 V2.x で動かないのは、ある程度は諦めるしか無いでしょう。  
opencv.jp はもう何年も更新停止していますし、そのサンプルの対象バージョンもあまりにも古いため、あまりあてにされない方がよろしいかと思います。  
カメラキャリブレーションのサンプルが欲しいのであれば、最新版に同梱されているサンプルを参考にした方がいいでしょう。  
<http://docs.opencv.org/2.4/doc/tutorials/calib3d/camera_calibration/camera_calibration.html>
CC BY-SA 3.0
2017-06-02T13:14:28.637
35226
2017-06-02T13:14:28.637
9935
34798
answer