OpenCVでのキャリブレーション

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
レイ

OpenCVでのキャリブレーション

#1

投稿記事 by レイ » 8年前

開発環境はWindows7 VisualStudio2015 C++です。
現在、下記のサイトのサンプルコードを利用してキャリブレーションを行おうとしています。

http://opencv.jp/sample/camera_calibrat ... alibration

しかし、デバックすると

エラー C4996 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

とでてしまいます。
そこで、C4996について調べたところ、”#define _CRT_SECURE_NO_WARNINGS" を先頭に入れることで解決できると書かれていたので実際にやってみると、今度は

エラー LNK2001 外部シンボル "〇〇" は未解決です。

といったエラーが30個ほどと、

MSB6006 "link.exe" はコード 1120 を伴って終了しました。

といったエラーが出てしまいます。
これらのエラーを解消するにはどうすればよいでしょうか?

レイ

Re: OpenCVでのキャリブレーション

#2

投稿記事 by レイ » 8年前

ソースコードは下記のものです。

コード:


#include <stdio.h>
#include <opencv/cv.h>
#include <opencv/highgui.h>

#include <opencv2/opencv.hpp>
#include <opencv2/opencv_lib.hpp>




#define IMAGE_NUM  (15)         /* 画像数*/
#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 (23.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_s(buf, "n%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(640, 480), 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;
}


metaphor

Re: OpenCVでのキャリブレーション

#3

投稿記事 by metaphor » 8年前

OpenCVのVersin1.0は使われているVersionでは無理なのでは?

metaphor

Re: OpenCVでのキャリブレーション

#4

投稿記事 by metaphor » 8年前

例えば、私のPCのVS2015のOpenCV3.1の場合は#include <opencv2/opencv_lib.hpp>が有りません。エラーが沢山でます。

metaphor

Re: OpenCVでのキャリブレーション

#5

投稿記事 by metaphor » 8年前

サイトは2009-07-01 の物でありVersinが古いです。http://ishidate.my.coocan.jp/opencv_17/opencv_17.htmは2015. 5.21の物なので参考になるかも知れません。

閉鎖

“C言語何でも質問掲示板” へ戻る