c++でopencvでのキャプチャ キャリブレーションでエラー
Posted: 2017年1月25日(水) 12:51
Windows10
VS2015
opencv2.4.11
の環境で
キャプチャしながらキャリブレーションしたらどうかと思って
http://electronics.extrem.ne.jp/cpp/ope ... eocapture/
と
http://opencv.jp/sample/camera_calibration.html
を併せて
以下のコードのようにしました。
エラー無しでビルドできるのですが
途中で
*src_img = rev_frame;
の部分で以下のエラーが発生します。
ハンドルされない例外が 0x00007FF7D80D7508 (opencvsample.exe) で発生しました: 0xC0000005: 場所 0x0000000000000000 への書き込み中にアクセス違反が発生しました。
lplimage cvmat 間の変換が問題だと思ったので
http://bicycle.life.coocan.jp/takamints ... conversion
を参考にしたんですが上手く動作していません。
どうしたらエラーをなくせるのか 教えて下さい。
どうぞよろしくお願いいたします。
int
main(int argc, char *argv[])
{
//IplImage *src_img, *dst_img;
CvMat *intrinsic, *distortion;
CvFileStorage *fs;
CvFileNode *param;
IplImage *mapx = cvCreateImage(cvSize(640, 480), IPL_DEPTH_32F, 1);
IplImage *mapy = cvCreateImage(cvSize(640, 480), IPL_DEPTH_32F, 1);
//if (argc < 2 || (src_img = cvLoadImage(argv[1], CV_LOAD_IMAGE_COLOR)) == 0)
// return -1;
//dst_img = cvCloneImage(src_img);
cv::VideoCapture cap(2);
// 様々な設定...
cap.set(CV_CAP_PROP_FRAME_WIDTH, 640);
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 480);
// カメラがオープンできたかの確認
if (!cap.isOpened())
{
printf("%s\n", "CameraOpenErr");
return -1;
};
while (1) {
cv::Mat frame;
cv::Mat rev_frame;
//IplImage frame, rev_frame;
do {
cap >> frame; // キャプチャ
} while (frame.empty()); //正しくキャプチャされるまで待つ
//cv::imshow("Capture", frame); // 表示
cv::flip(frame, rev_frame, 1);
fs = cvOpenFileStorage("C:/temp/c++/nCal/camera.xml", 0, CV_STORAGE_READ);
param = cvGetFileNodeByName(fs, NULL, "intrinsic");
intrinsic = (CvMat *)cvRead(fs, param);
param = cvGetFileNodeByName(fs, NULL, "distortion");
distortion = (CvMat *)cvRead(fs, param);
cvReleaseFileStorage(&fs);
// (1)歪み補正のためのマップ初期化
cvInitUndistortMap(intrinsic, distortion, mapx, mapy);
// (2)歪み補正
//cvRemap(src_img, dst_img, mapx, mapy);
IplImage *src_img = 0;
IplImage *dst_img=0;
cv::imshow("Capture", rev_frame);
cvWaitKey(1);
*src_img = rev_frame;
cvRemap(src_img, dst_img, mapx, mapy);
cvNamedWindow("Distortion", CV_WINDOW_AUTOSIZE);
cvShowImage("Distortion", src_img);
cvNamedWindow("UnDistortion", CV_WINDOW_AUTOSIZE);
cvShowImage("UnDistortion", dst_img);
//cvWaitKey(0);
cvDestroyWindow("Distortion");
cvDestroyWindow("UnDistortion");
cvReleaseImage(&src_img);
cvReleaseImage(&dst_img);
cvReleaseImage(&mapx);
cvReleaseImage(&mapy);
cvReleaseMat(&intrinsic);
cvReleaseMat(&distortion);
return 0;
}
VS2015
opencv2.4.11
の環境で
キャプチャしながらキャリブレーションしたらどうかと思って
http://electronics.extrem.ne.jp/cpp/ope ... eocapture/
と
http://opencv.jp/sample/camera_calibration.html
を併せて
以下のコードのようにしました。
エラー無しでビルドできるのですが
途中で
*src_img = rev_frame;
の部分で以下のエラーが発生します。
ハンドルされない例外が 0x00007FF7D80D7508 (opencvsample.exe) で発生しました: 0xC0000005: 場所 0x0000000000000000 への書き込み中にアクセス違反が発生しました。
lplimage cvmat 間の変換が問題だと思ったので
http://bicycle.life.coocan.jp/takamints ... conversion
を参考にしたんですが上手く動作していません。
どうしたらエラーをなくせるのか 教えて下さい。
どうぞよろしくお願いいたします。
int
main(int argc, char *argv[])
{
//IplImage *src_img, *dst_img;
CvMat *intrinsic, *distortion;
CvFileStorage *fs;
CvFileNode *param;
IplImage *mapx = cvCreateImage(cvSize(640, 480), IPL_DEPTH_32F, 1);
IplImage *mapy = cvCreateImage(cvSize(640, 480), IPL_DEPTH_32F, 1);
//if (argc < 2 || (src_img = cvLoadImage(argv[1], CV_LOAD_IMAGE_COLOR)) == 0)
// return -1;
//dst_img = cvCloneImage(src_img);
cv::VideoCapture cap(2);
// 様々な設定...
cap.set(CV_CAP_PROP_FRAME_WIDTH, 640);
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 480);
// カメラがオープンできたかの確認
if (!cap.isOpened())
{
printf("%s\n", "CameraOpenErr");
return -1;
};
while (1) {
cv::Mat frame;
cv::Mat rev_frame;
//IplImage frame, rev_frame;
do {
cap >> frame; // キャプチャ
} while (frame.empty()); //正しくキャプチャされるまで待つ
//cv::imshow("Capture", frame); // 表示
cv::flip(frame, rev_frame, 1);
fs = cvOpenFileStorage("C:/temp/c++/nCal/camera.xml", 0, CV_STORAGE_READ);
param = cvGetFileNodeByName(fs, NULL, "intrinsic");
intrinsic = (CvMat *)cvRead(fs, param);
param = cvGetFileNodeByName(fs, NULL, "distortion");
distortion = (CvMat *)cvRead(fs, param);
cvReleaseFileStorage(&fs);
// (1)歪み補正のためのマップ初期化
cvInitUndistortMap(intrinsic, distortion, mapx, mapy);
// (2)歪み補正
//cvRemap(src_img, dst_img, mapx, mapy);
IplImage *src_img = 0;
IplImage *dst_img=0;
cv::imshow("Capture", rev_frame);
cvWaitKey(1);
*src_img = rev_frame;
cvRemap(src_img, dst_img, mapx, mapy);
cvNamedWindow("Distortion", CV_WINDOW_AUTOSIZE);
cvShowImage("Distortion", src_img);
cvNamedWindow("UnDistortion", CV_WINDOW_AUTOSIZE);
cvShowImage("UnDistortion", dst_img);
//cvWaitKey(0);
cvDestroyWindow("Distortion");
cvDestroyWindow("UnDistortion");
cvReleaseImage(&src_img);
cvReleaseImage(&dst_img);
cvReleaseImage(&mapx);
cvReleaseImage(&mapy);
cvReleaseMat(&intrinsic);
cvReleaseMat(&distortion);
return 0;
}