キャリブレーション
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 595
キャリブレーションしようとして下のコードをビルドすると
//エラーの箇所で
warning C4244: '=' : 'double' から 'float' への変換です。データが失われる可能性があります。
と出ます。また、
: error LNK2019: 未解決の外部シンボル _cvFindExtrinsicCameraParams2 が関数 _main で参照されました。
: error LNK2019: 未解決の外部シンボル _cvCalibrateCamera2 が関数 _main で参照されました。
: error LNK2019: 未解決の外部シンボル _cvDrawChessboardCorners が関数 _main で参照されました。
: error LNK2019: 未解決の外部シンボル _cvFindChessboardCorners が関数 _main で参照されました。
と表示されます。
どうしたらエラーを消せますか。
include"OpenCV.h"
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_NUM*PAT_SIZE)
define CHESS_SIZE (24.0)
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);
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);
}
}
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 =(float) j * CHESS_SIZE;//エラー
objects[i * PAT_SIZE + j * PAT_COL + k].y =(float) k * CHESS_SIZE;//エラー
objects[i * PAT_SIZE + j * PAT_COL + k].z = 0.0;
}
}
}
cvInitMatHeader (&object_points, ALL_POINTS, 3, CV_32FC1, objects);
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");
}
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);
cvCalibrateCamera2(&object_points, &image_points, &point_counts, cvSize (640, 480), intrinsic, distortion);
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);
CvFileStorage *fs;
fs = cvOpenFileStorage ("camera.xml", 0, CV_STORAGE_WRITE);
cvWrite(fs, "intrinsic", intrinsic);
cvWrite(fs, "rotation", rotation);
cvWrite(fs, "translation", translation);(&fs);
for(i=0;i<IMAGE_NUM;i++){
cvReleaseImage(&src_img[i]);
}
return 0;
}
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
なかなか回答が付かないようですので、OpenCVを使ったことがないですが気づいた点を指摘します。
どうしたらエラーを消せますか。
エラーメッセージからは使用している関数の実体が見つからないということが判ります。外部のライブラリが上手くリンクできていないようです。libファイルが提供されている場合、プロジェクトの設定で読み込む設定が追加してあるか、指定したパスが間違っていないか確認してみてください。
dllファイルのみの場合、Win32 APIのLoadLibrary等で必要なDLLを読み込んでいるか確認してみてください。
推測で恐縮ですが、こういったライブラリの場合、ヘッダファイルなどでLoadLibraryの処理を記述してあって、ヘッダをインクルードするだけで使用できるようになっていることが多いと思いますが、コメントアウトされている
//#include<cv.h>
//#include<highgui.h>
が気になります。これらのヘッダでライブラリ読み込みの処理をやっていないか中身を確認してみてはいかがでしょうか。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 90.35%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
yohhoy
2017/03/17 20:05
https://teratail.com/help/question-tips#questionTips3-5-1 をご一読ください。