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

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

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

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

3058閲覧

キャリブレーション

toyadai056

総合スコア34

OpenCV

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2017/03/17 08:46

キャリブレーションしようとして下のコードをビルドすると
//エラーの箇所で
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_ROWPAT_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;

}

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

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

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

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

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

guest

回答1

0

ベストアンサー

なかなか回答が付かないようですので、OpenCVを使ったことがないですが気づいた点を指摘します。

どうしたらエラーを消せますか。

エラーメッセージからは使用している関数の実体が見つからないということが判ります。外部のライブラリが上手くリンクできていないようです。libファイルが提供されている場合、プロジェクトの設定で読み込む設定が追加してあるか、指定したパスが間違っていないか確認してみてください。
dllファイルのみの場合、Win32 APIのLoadLibrary等で必要なDLLを読み込んでいるか確認してみてください。

推測で恐縮ですが、こういったライブラリの場合、ヘッダファイルなどでLoadLibraryの処理を記述してあって、ヘッダをインクルードするだけで使用できるようになっていることが多いと思いますが、コメントアウトされている

c++

1//#include<cv.h> 2//#include<highgui.h>

が気になります。これらのヘッダでライブラリ読み込みの処理をやっていないか中身を確認してみてはいかがでしょうか。

投稿2017/03/28 08:33

KoichiSugiyama

総合スコア3041

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問