質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Q&A

3回答

4323閲覧

OpenCV カメラキャリブレーションのやり方を教えてください。

toruhonda

総合スコア30

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

0グッド

0クリップ

投稿2015/12/22 06:43

プログラム初心者です。
現在大学の研究で視差画像の取得をしようとしています。
カメラキャリブレーションをサンプルコードを利用しやってみたのですがデバッグすることができません。
以下のサンプルソースを用いてやった結果を下記に書かせていただきました。
どこが違うのか教えていただきたいです。

visual 2010 opencv 2.3.1を使用しています。

サンプルコードのサイト
http://opencv.jp/sample/camera_calibration.html

// OpenCV2.3.1Sample.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//
#include "stdafx.h"
//プロジェクトのプロパティ⇒C/C++⇒全般 の追加のインクルードディレクトリに
// opencv2のあるフォルダ『C:\OpenCV\include』などを追加のこと
#include "opencv2\opencv.hpp"
#include <iostream>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/objdetect/objdetect.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>

using namespace cv;
using namespace std;

#ifdef _DEBUG
//Debugモードの場合
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_core231d.lib")
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_imgproc231d.lib")
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_highgui231d.lib")
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_objdetect231d.lib")
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_contrib231d.lib")
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_features2d231d.lib")
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_flann231d.lib")
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_gpu231d.lib")
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_haartraining_engined.lib")
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_legacy231d.lib")
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_ts231d.lib")
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_video231d.lib")
#else
//Releaseモードの場合
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_core231.lib")
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_imgproc231.lib")
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_highgui231.lib")
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_objdetect231.lib")
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_contrib231.lib")
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_features2d231.lib")
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_flann231.lib")
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_gpu231.lib")
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_haartraining_engined.lib")
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_legacy231.lib")
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_ts231.lib")
#pragma comment(lib,"C:\OpenCV2.3.1\build\x86\vc10\lib\opencv_video231.lib")

#endif

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

#define IMAGE_NUM (25) /* 画像数 /
#define PAT_ROW (7) /
パターンの行数 /
#define PAT_COL (10) /
パターンの列数 /
#define PAT_SIZE (PAT_ROW
PAT_COL)
#define ALL_POINTS (IMAGE_NUMPAT_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.png", 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;
}

1>------ ビルド開始: プロジェクト: m110552, 構成: Debug Win32 ------
1>youta.obj : error LNK2019: 未解決の外部シンボル _cvFindExtrinsicCameraParams2 が関数 _main で参照されました。
1>youta.obj : error LNK2019: 未解決の外部シンボル _cvCalibrateCamera2 が関数 _main で参照されました。
1>youta.obj : error LNK2019: 未解決の外部シンボル _cvDrawChessboardCorners が関数 _main で参照されました。
1>youta.obj : error LNK2019: 未解決の外部シンボル _cvFindChessboardCorners が関数 _main で参照されました。
1>F:\toru\Debug\m110552.exe : fatal error LNK1120: 外部参照 4 が未解決です。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

izkn

2015/12/28 05:21

こちらの質問が他のユーザから「質問の範囲が広すぎる」という評価を受けています わからない点を明確にし、調査したこと・試したことと共に記入していただくと、回答が得られやすくなります。
guest

回答3

0

プロジェクトのプロパティーでリンカーの入力のところに追加の依存ファイルに
’cv.lib cxcore.lib highgui.lib’を設定してみてください。

投稿2016/11/10 10:02

MasahikoHirata

総合スコア3747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

もしまだ未解決であれば、無料で使えるVisual Studio 2015にopencv 3.1を使う事を勧めます。

投稿2016/11/09 10:55

MasahikoHirata

総合スコア3747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

普通に参照設定に設定されていない可能性があります。
関数が含まれているdllを確認ください。

投稿2016/11/07 23:01

miyamoto0105

総合スコア216

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問