• 締切済み

OpenCVのエラーが取れません。

VC++にてOpenCVを使って画像処理を行っています。 cvHoughCircles関数を使ってハフ変換による円検出をしているのですが、 「Null pointer(NULL array pointer is passed)  in function cvGetMat,C\User\VP\opencv\cxcore\src\cxarry.cpp(2780)  Press"Abort"to terminate application. Press"Retry"to debug(if the app is running under debugger). Press"Ignore"to continue(this is not safe).」 というエラーが出てしまいます。 これはいったいどういったエラーなのでしょうか? プログラムは以下の通りです。 //-------------------------------------------------- #include <stdio.h> #include <cv.h> #include <highgui.h> int main (int argc, char **argv) { int i; float *p; IplImage *src_img = 0, *src_img_gray = 0; CvMemStorage *storage; CvSeq *circles = 0; char *filename = "lena.jpg"; IplImage *image; //画像の読み込み・平滑化・二値化 image = cvLoadImage(filename, 0); // 0: グレイスケールで読み込む // (2)ハフ変換のための前処理(画像の平滑化を行なわないと誤検出が発生しやすい) cvSmooth (src_img_gray, src_img_gray, CV_GAUSSIAN, 11, 11, 0, 0); storage = cvCreateMemStorage (0); // (3)ハフ変換による円の検出と検出した円の描画 circles = cvHoughCircles (src_img_gray, storage, CV_HOUGH_GRADIENT, 1, 100, 20, 50, 10, MAX (src_img_gray->width, src_img_gray->height)); for (i = 0; i < circles->total; i++) { p = (float *) cvGetSeqElem (circles, i); cvCircle (src_img, cvPoint (cvRound (p[0]), cvRound (p[1])), 3, CV_RGB (0, 255, 0), -1, 8, 0); cvCircle (src_img, cvPoint (cvRound (p[0]), cvRound (p[1])), cvRound (p[2]), CV_RGB (255, 0, 0), 3, 8, 0); } // (4)検出結果表示用のウィンドウを確保し表示する cvNamedWindow ("circles", 1); cvShowImage ("circles", src_img); cvWaitKey (0); cvDestroyWindow ("circles"); cvReleaseImage (&src_img); cvReleaseImage (&src_img_gray); cvReleaseMemStorage (&storage); return 0; } //----------------------------------------------------- 解決方法など分かりましたら、よろしくお願いいたします。

みんなの回答

回答No.1

 こんばんは。 >>これはいったいどういったエラーなのでしょうか?  cvSmooth (src_img_gray, src_img_gray, CV_GAUSSIAN, 11, 11, 0, 0);  の中で起こしています。src_img_grayにイメージが割り当てられていないので、「NULLのポインタを渡した」と、文句を言われているのではないでしょうか。  ファイルから読み込んだイメージをsrc_imgに入れ、dst_imgにも同じサイズを持ったイメージを割り当て、dst_imgに向かって関数を通して画像処理結果を出力する様に、扱うのではないでしょうか。  以下で動作しました。 int main (int argc, char **argv) { int i; float *p; CvMemStorage *storage; CvSeq *circles = 0; char *filename = "lena.jpg"; IplImage *src_img = 0, *dst_img = 0; //画像の読み込み・平滑化・二値化 src_img = cvLoadImage(filename, 0); // 0: グレイスケールで読み込む //ココでdst_imgにも同じ容量を割り当てる(面倒なのでクローンする) dst_img = cvCloneImage(src_img); // (2)ハフ変換のための前処理(画像の平滑化を行なわないと誤検出が発生しやすい) cvSmooth (src_img, dst_img, CV_GAUSSIAN, 11, 11, 0, 0); storage = cvCreateMemStorage (0); // (3)ハフ変換による円の検出と検出した円の描画 circles = cvHoughCircles (dst_img, storage, CV_HOUGH_GRADIENT, 1, 100, 20, 50, 10, MAX (dst_img->width, dst_img->height)); for (i = 0; i < circles->total; i++) { p = (float *) cvGetSeqElem (circles, i); cvCircle (dst_img, cvPoint (cvRound (p[0]), cvRound (p[1])), 3, CV_RGB (0, 255, 0), -1, 8, 0); cvCircle (dst_img, cvPoint (cvRound (p[0]), cvRound (p[1])), cvRound (p[2]), CV_RGB (255, 0, 0), 3, 8, 0); } // (4)検出結果表示用のウィンドウを確保し表示する cvNamedWindow ("circles", 1); cvShowImage ("circles", dst_img); cvWaitKey (0); cvDestroyWindow ("circles"); cvReleaseImage (&dst_img); cvReleaseImage (&src_img); cvReleaseMemStorage (&storage); return 0; }

s0511146
質問者

お礼

ご回答ありがとうございます。 無事にエラーがとれ実行することができました。

関連するQ&A

  • OpenCV

    いつもお世話になっております。 添付の2値画像からハフ関数で直線抽出したいのですが、うまく行かず困っています。 エラーは表示されず、ただグレー 一色の出力です。 閾値、投票数、最小長さ、など値をいろいろ変えてみたのですがうまくいきません。 どなたか原因がおわかりであればぜひ教えてください。 よろしくお願い致します。 '================================================== ’void Sample(char *FilePath){ int i; float *line, rho, theta; double a, b, x0, y0; IplImage *src_img_std = 0, *src_img_prob = 0, *src_img_gray = 0; CvMemStorage *storage; CvSeq *lines = 0; CvPoint *point, pt1, pt2; src_img_gray = cvLoadImage(FilePath, CV_LOAD_IMAGE_GRAYSCALE); storage = cvCreateMemStorage(0); // (3)標準的ハフ変換による線の検出と検出した線の描画 lines = cvHoughLines2(src_img_gray, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI / 180, 1, 1, 0); for (i = 0; i <lines->total; i++) { line = (float *)cvGetSeqElem(lines, i); rho = line[0]; theta = line[1]; a = cos(theta); b = sin(theta); x0 = a * rho; y0 = b * rho; pt1.x = cvRound(x0 + 1000 * (-b)); pt1.y = cvRound(y0 + 1000 * (a)); pt2.x = cvRound(x0 - 1000 * (-b)); pt2.y = cvRound(y0 - 1000 * (a)); cvLine(src_img_std, pt1, pt2, CV_RGB(255, 0, 0), 3, 8, 0); } cvNamedWindow("Hough_line_standard", CV_WINDOW_AUTOSIZE); cvShowImage("Hough_line_standard", src_img_std); cvWaitKey(0); cvDestroyWindow("Hough_line_standard");

  • OpenCVでの画像からの顔検出

    OpenCVでの顔検出プログラム 以下のようなプログラムを実行したいのですが、ちゃんとビルトできるものの 肝心な画像からの顔認識が行われません。 例えばimg_0000.bmpという画像の顔認識を実行したい場合、 画像の読み込みの部分のプログラムを変えるべきなのか、bmpのイメージを置くフォルダの場所が間違っているのか 原因がわかりません。よろしければ手を貸していただきたいです。 ------------------------------------------------------------------- #include <cv.h> #include <highgui.h> int main (int argc, char **argv) { int i; IplImage *src_img = 0, *src_gray = 0; const char *cascade_name = "haarcascade_frontalface_default.xml"; CvHaarClassifierCascade *cascade = 0; CvMemStorage *storage = 0; CvSeq *faces; static CvScalar colors[] = { {{0, 0, 255}}, {{0, 128, 255}}, {{0, 255, 255}}, {{0, 255, 0}}, {{255, 128, 0}}, {{255, 255, 0}}, {{255, 0, 0}}, {{255, 0, 255}} }; // (1)画像を読み込む if (argc < 2 || (src_img = cvLoadImage (argv[1], CV_LOAD_IMAGE_COLOR)) == 0) return -1; src_gray = cvCreateImage (cvGetSize (src_img), IPL_DEPTH_8U, 1); // (2)ブーストされた分類器のカスケードを読み込む cascade = (CvHaarClassifierCascade *) cvLoad (cascade_name, 0, 0, 0); // (3)メモリを確保し,読み込んだ画像のグレースケール化,ヒストグラムの均一化を行う storage = cvCreateMemStorage (0); cvClearMemStorage (storage); cvCvtColor (src_img, src_gray, CV_BGR2GRAY); cvEqualizeHist (src_gray, src_gray); // (4)物体(顔)検出 faces = cvHaarDetectObjects (src_gray, cascade, storage, 1.11, 4, 0, cvSize (40, 40)); // (5)検出された全ての顔位置に,円を描画する for (i = 0; i < (faces ? faces->total : 0); i++) { CvRect *r = (CvRect *) cvGetSeqElem (faces, i); CvPoint center; int radius; center.x = cvRound (r->x + r->width * 0.5); center.y = cvRound (r->y + r->height * 0.5); radius = cvRound ((r->width + r->height) * 0.25); cvCircle (src_img, center, radius, colors[i % 8], 3, 8, 0); } // (6)画像を表示,キーが押されたときに終了 cvNamedWindow ("Face Detection", CV_WINDOW_AUTOSIZE); cvShowImage ("Face Detection", src_img); cvWaitKey (0); cvDestroyWindow ("Face Detection"); cvReleaseImage (&src_img); cvReleaseImage (&src_gray); cvReleaseMemStorage (&storage); return 0; } -------------------------------------------------------- 以上のプログラムです。よろしくお願いします。

  • プログラムについて

    Opencvで作成したプログラムですが、コンパイルはできるのにエラーが出ます。助けてください。 #include <cv.h> #include <highgui.h> int main (int argc, char **argv) { int i; IplImage *src_img = 0, *src_gray = 0; const char *cascade_name = "haarcascade_frontalface_default.xml"; CvHaarClassifierCascade *cascade = 0; CvMemStorage *storage = 0; CvSeq *faces; static CvScalar colors[] = { {{0, 0, 255}}, {{0, 128, 255}}, {{0, 255, 255}}, {{0, 255, 0}}, {{255, 128, 0}}, {{255, 255, 0}}, {{255, 0, 0}}, {{255, 0, 255}} }; // (1)画像を読み込む if (argc < 2 || (src_img = cvLoadImage (argv[1], CV_LOAD_IMAGE_COLOR)) == 0) return -1; src_gray = cvCreateImage (cvGetSize (src_img), IPL_DEPTH_8U, 1); // (2)ブーストされた分類器のカスケードを読み込む cascade = (CvHaarClassifierCascade *) cvLoad (cascade_name, 0, 0, 0); // (3)メモリを確保し,読み込んだ画像のグレースケール化,ヒストグラムの均一化を行う storage = cvCreateMemStorage (0); cvClearMemStorage (storage); cvCvtColor (src_img, src_gray, CV_BGR2GRAY); cvEqualizeHist (src_gray, src_gray); // (4)物体(顔)検出 faces = cvHaarDetectObjects (src_gray, cascade, storage, 1.1, 3, 0, cvSize (20, 20)); // (5)検出された全ての顔位置に,円を描画する for (i = 0; i < (faces ? faces->total : 0); i++) { CvRect *r = (CvRect *) cvGetSeqElem (faces, i); CvPoint center; int radius; center.x = cvRound (r->x + r->width * 0.5); center.y = cvRound (r->y + r->height * 0.5); radius = cvRound ((r->width + r->height) * 0.25); cvCircle (src_img, center, radius, colors[i % 8], 3, 8, 0); } // (6)画像を表示,キーが押されたときに終了 cvNamedWindow ("Face Detection", CV_WINDOW_AUTOSIZE); cvShowImage ("Face Detection", src_img); cvWaitKey (0); return 0; }

  • OpenCV2.3 のエラー

    Open CV2.3をVisual Studio2013 expresssに設定しました。 が、プログラムを実行すると 「エラー 3 error LNK1107: ファイルが無効であるか、または壊れています: 0x10B000 を読み取れません。 C:\Program Files\opencv\build\x64\vc10\staticlib\IlmImf.pdb...」 と表示されてしまい、困っています。 エラー原因は[リンカー]-[入力]-[追加の依存ファイル]の設定でしょうか。 当初、libとstaticlibフォルダの中にある、拡張子pbdを含む、重複なしのすべてのファイルを[追加の依存ファイル]に設定していましたが、これがエラーの原因かと思い、 libとstaticlibフォルダ内の、拡張子libのみに修正しました。 が、同じエラーが依然として出ています。 プログラムは以下の内容で、単純に画像を表示させるだけのものです。 ============================================= #include <cxcore.h> #include <cv.h> #include <highgui.h> int _tmain(int argc) { IplImage *src_img = 0, *dst_img; // (1)画像を読み込む src_img = cvLoadImage("C\\Users\\...\\thNDM091S8.jpg", CV_LOAD_IMAGE_COLOR); // (6)画像の表示 cvNamedWindow("Fitting", CV_WINDOW_AUTOSIZE); cvShowImage("Fitting", src_img); cvWaitKey(0); cvDestroyWindow("Fitting"); cvReleaseImage(&src_img); return 0; } ============================================== どこを直せばいいでしょうか。 いろいろと調べましたがわかりませんので、教えていただけると助かります。 よろしくお願いいたします。

  • OpencvでDebug errorが発生します。

    初投稿です。 現在、Opencvでカメラキャリブレーション を行うべく、下記を参照にしながらプログラミングを行っております。URL:http://opencv.jp/sample/camera_calibration.html エラーはなくなったのですがDebug erroerが発生します。 その改善策を教えていただきたいです。 C++を初めて一か月の初心者ですが宜しくお願いします。 <開発環境> Visual studio2015 opencv2.4.11 -source code- #pragma warning(push) #pragma warning(disable:4996) #pragma warning ( disable : 4789 ) #include <stdio.h> #include <opencv/cv.h> #include <opencv2/highgui/highgui.hpp> #define CRT_SECURE_NO_WARNINGS #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 (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++) { // src_img[IMAGE_NUM] = cvLoadImage("CameraTestImage1", CV_LOAD_IMAGE_COLOR); char buf[32]; sprintf(buf, "CameraTestImage1/ % 02d.JPG", i); src_img[i] = cvLoadImage("c:\\opencvCalib\\caliblation\\CameraTestImage1/ % 02d.JPG"); // sprintf(buf, "c:\\opencvCalib\\caliblation\\CameraTestImage1/ % 02d.JPG", 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 = 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); 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); cvWrite(fs, "distortion", distortion); cvReleaseFileStorage(&fs); for (i = 0; i < IMAGE_NUM; i++) { cvReleaseImage(&src_img[i]); } return 0; }

  • OpenCV 2値化について

    いつもお世話になっております。 画像の2値化(黒は全てゼロ、白は全て255)をした画像bw_imgを用意して 左上端から11×11サイズのROIに切り取って決まった処理をかけていこうとしていますが、 2値化した画像をROIで保持させることができず、困っています。 int main() { //画像の2値化処理用変数 IplImage *src_img = 0, *dst_img = 0, *bw_img = 0; IplImage *src_img_gray = 0; IplImage *tmp_img, *out_img, *lap_img; CvMemStorage *storage = cvCreateMemStorage(0); CvSeq *contours = 0; // (1)画像を読み込み、グレースケール化(src_img_gray)、二値化(tmp_img) src_img = cvLoadImage("C:\\Users...\\サンプル画像\\sample.jpg", CV_LOAD_IMAGE_COLOR); tmp_img = cvCreateImage(cvGetSize(src_img), IPL_DEPTH_8U, 1); src_img_gray = cvCreateImage(cvGetSize(src_img), IPL_DEPTH_8U, 1);//もとはIPL_DEPTH_8U cvCvtColor(src_img, src_img_gray, CV_BGR2GRAY); cvAdaptiveThreshold(src_img_gray, tmp_img, 255, CV_ADAPTIVE_THRESH_GAUSSIAN_C, CV_THRESH_BINARY, 7, 8); //11×11 走査用変数 dst_img = cvCreateImage(cvGetSize(tmp_img), IPL_DEPTH_8U, 1); bw_img = cvCreateImage(cvGetSize(tmp_img), IPL_DEPTH_8U, 1); out_img = cvCreateImage(cvGetSize(tmp_img), IPL_DEPTH_8U, 1); cvThreshold(tmp_img, bw_img, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU); for (x = 0; x < bw_img->width; x++){ // x 座標を 1ピクセルずつ進める for (y = 0; y < bw_img->height; y++){ // y 座標を 1ピクセルずつ進める //(1) 11×11ピクセルに切り取って2値化する。 cvCopy(bw_img, dst_img); lap_img = cvCreateImage(cvSize(11, 11), IPL_DEPTH_8U, 1); CvMat *sub = cvCreateMatHeader(11, 11, CV_8UC1); cvGetSubRect(bw_img, sub, cvRect(y, x, 11, 11)); //コピー画像から11×11切り取り。 cvThreshold(sub, lap_img, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU); //2値化、結果はlap_img. uchar iro = lap_img->imageData[lap_img->widthStep * (y + 6) + (x + 6)]; if (iro ==0){ →ここでどうみても黒なのにiroに「238」「71」などの値が入っています。 roiで切り取ったlap_imgが2値になっていません。 何が問題で2値化できていないのでしょうか。 どうすると2値化した画像(lap_img)を決まったサイズのウィンドウで扱えるでしょうか。 もしおわかりでしたらヒントでも結構ですのでぜひ教えてください。 よろしくお願いします。

  • OpenCVでサンプルコードを使うとエラーが出ます

    環境はVidualStudio2008、OpenCVは2.1のバージョンを利用しています。 OpenCVのテンプレートマッチングのサンプルを利用したところエラーが発生しました。 ソースは以下のものを使っています。 ところどころに入っているprintfは私が自分で入れたものですがこれが原因であるとは考えにくいのです。 エラーは添付したような画像で現れます。 またデバッグしたところ [下のフレームは間違っているか、または見つかりません。KernelBase.dll に対して読み込まれたシンボルはありません。] KernelBase.dll!76b7b9bc() このような文章も表示されました。 どうすれば解決できるでしょうか。 #include <cv.h> #include <highgui.h> int main (int argc, char **argv) { double min_val, max_val; CvPoint min_loc, max_loc; CvSize dst_size; IplImage *src_img, *tmp_img, *dst_img; argv[1]="○○"; argv[2]="○○"; argc=3; printf("1complete\n"); cvNamedWindow ("Image", 1); src_img = cvLoadImage (argv[1], CV_LOAD_IMAGE_COLOR); tmp_img = cvLoadImage (argv[2], CV_LOAD_IMAGE_COLOR); if(argc != 3 || (src_img = cvLoadImage (argv[1], CV_LOAD_IMAGE_COLOR))==0||(tmp_img = cvLoadImage (argv[2], CV_LOAD_IMAGE_COLOR))==0) return -1; printf("2complete\n"); // (1)探索画像全体に対して,テンプレートのマッチング値(指定した手法に依存)を計算 dst_size = cvSize (src_img->width - tmp_img->width + 1, src_img->height - tmp_img->height + 1); printf("2-1complete\n"); dst_img = cvCreateImage (dst_size, IPL_DEPTH_32F, 1);    //ここで動作停止 printf("2-2complete\n"); cvMatchTemplate (src_img, tmp_img, dst_img, CV_TM_CCOEFF_NORMED); printf("2-3complete\n"); cvMinMaxLoc (dst_img, &min_val, &max_val, &min_loc, &max_loc, NULL); printf("3complete\n"); // (2)テンプレートに対応する位置に矩形を描画 cvRectangle (src_img, max_loc, cvPoint (max_loc.x + tmp_img->width, max_loc.y + tmp_img->height), CV_RGB (255, 0, 0), 3); printf("4complete\n"); cvShowImage ("Image", src_img); printf("ALL COMPLETE!\n"); cvWaitKey (0); cvDestroyWindow ("Image"); cvReleaseImage (&src_img); cvReleaseImage (&tmp_img); cvReleaseImage (&dst_img); return 0; }

  • opencvでのエラーが解決できません

    今、OPENCVで顔検出とSURFを組み合わせてプログラムを組んでいます。キャプチャ画像を顔検出してから検出された場所を切り出しSURFをかけようと考えています。 ビルドは成功するのですが、実行すると顔検出された瞬間に以下のエラーが出ます。 OpenCV Error: Null pointer (NULL array pointer is passed) in unknown function, file .\cxarray.cpp, line 2370 プログラムは while(1){ storage = cvCreateMemStorage(0); if( use_file_flag == 0 ) { if( captureImage == NULL ) continue; if( dstImage == NULL ) dstImage = cvCloneImage( captureImage ); } captureImage = cvQueryFrame(capture); cvCvtColor(captureImage, image, CV_BGR2GRAY); detect = cvCloneImage( dstImage2 ); //SURF特徴点抽出 cvExtractSURF( object, 0, &objectKeypoints, &objectDescriptors, storage, params ); cvExtractSURF( image, 0, &imageKeypoints, &imageDescriptors, storage, params ); cvSetImageROI( correspond, cvRect( 0, 0, object->width, object->height ) ); cvCopy( object , correspond ); cvSetImageROI( correspond, cvRect( 0, object->height, correspond->width, correspond-height ) ); cvCvtColor(dstImage, dstImage2, CV_BGR2GRAY); cvCopy( dstImage2, correspond ); cvResetImageROI( correspond ); /*if(*/ locatePlanarObject( objectKeypoints, objectDescriptors, imageKeypoints,imageDescriptors,src_corners, dst_corners );//) vector <int>ptpairs; findPairs( objectKeypoints, objectDescriptors, imageKeypoints, imageDescriptors, ptpairs ); MAX_P = (int)ptpairs.size()/2; //SURF照合結果表示 for(int i = 0; i < MAX_P; i++) {CvSURFPoint* r1 = (CvSURFPoint*)cvGetSeqElem( objectKeypoints, ptpairs[i*2] ); CvSURFPoint* r2 = (CvSURFPoint*)cvGetSeqElem( imageKeypoints, ptpairs[i*2+1] ); cvLine( correspond, cvPointFrom32f(r1->pt), cvPoint(cvRound(r2->pt.x), cvRound(r2->pt.y+object->height)), colors[8] ); } printf("%d\n", MAX_P); printf("%s\n", objectKeypoints); // 顔検出と描画 static CvScalar color = { 255, 255, 255 }; int j; int levels = 128; IplImage *small_img = cvCreateImage(cvSize( cvRound( captureImage->width /DOWNSCALE),cvRound( captureImage->height / DOWNSCALE )), 8, 1); IplImage *binary = cvCreateImage( cvSize( captureImage->width, captureImage->height ), 8, 1); cvThreshold(image,bi

  • openCVの画像処理について

    画像の中にある粒子の位置を検出し、座標の値の取得をどうしてもOpenCVをつかって、出したいと考えております。 プログラミングが実行したら、すべて0と表示されたり、エラーが出たりします。 現在、画像を読み込み、2値化し、2値化した画像の画素数を列ごとに足して、垂直方向の画素数の最大値の検出、2値化した画像の画素数を行ごとに足して、水平方向の画素数の最大値の検出を行っています。 使用した画像を添付させていただきますので、もしアドバイスなどいただけたらよろしくお願い致します。 #include <stdio.h> #include <math.h> #include <cv.h> #include <cxcore.h> #include <highgui.h> #define X 640 #define Y 480 IplImage *grayImage; //グレースケール画像用IplImage IplImage *binaryImage; //2値画像用IplImage char windowNameBinarization[] = "Binarization";//2値化した画像を表示するウィンドウの名前 int levels = 115; //トラックバーの値(2値化の際の閾値) static int h[X][Y]; int main( /*int argc, char **argv*/ ){ // 画像を読み込む IplImage *sourceImage = cvLoadImage( "C:/Documents and Settings/Owner/My Documents/My Pictures/Logicool Webcam/Picture 10.jpg",CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); if ( sourceImage == NULL ) { // 画像が見つからなかった場合 printf( "画像が見つかりません\n" ); return -1; } // 画像を生成する IplImage *grayImage = cvCreateImage( cvGetSize(sourceImage), IPL_DEPTH_8U, 1 );//グレースケール画像用IplImage IplImage *binaryImage = cvCreateImage( cvGetSize(sourceImage), IPL_DEPTH_8U, 1 ); //2値画像用IplImage // BGRからグレースケールに変換する cvCvtColor( sourceImage, grayImage, CV_BGR2GRAY ); // グレースケールから2値に変換する cvThreshold( grayImage, binaryImage, levels, 255, CV_THRESH_BINARY ); /*グラフ値の取得*/ IplImage *img; img = cvCloneImage (binaryImage); //画像をコピー int bytes_per_pixel = ((img->depth & 255) / 8) * img->nChannels; // (1)画素値を順次取得 int i,j,k,t; int Hy[Y],Hx[X]; //宣言 //垂直方向の画素値 for(k = 0; k <Y /*img->height*/; k++) { Hy[k] = 0;//初期化 } if((unsigned char)img->imageData>levels){ for(j = 0;j < Y/*img->height*/; j++) { for(i = 0; i < X; i++) {Hy[j] += *(img->imageData + (img->widthStep*j) + (i*bytes_per_pixel)); } }} //水平方向の画素値 for(t = 0; t < X/*img->width*/; t++) { Hx[t]=0; //初期化 } if((unsigned char)img->imageData>levels){ for(i = 0;i < X/*img->width*/; i++) { for(j = 0;j < Y; j++) { Hx[i] = Hx[i]+h[i][j]; } }} //Hy[j]の最大値の座標を調べる int MY = Hy[0]; int my = 0; for(int j=0; j< Y-1; j++){ if(Hy[j]<Hy[j+1]){ MY = Hy[j+1]; my = j+1; } } //Hx[i]の最大値の座標を調べる int MX = Hx[0]; int mx = 0; for(int i=0; i< X-1; i++){ if(Hx[i]<Hx[i+1]){ MX = Hx[i+1]; mx = i+1; } } printf("垂直方向の最大値 %d , 垂直方向の最大値になるときのy軸の値 %d \n", MY,my); printf("水平方向の最大値 %d , 水平方向の最大値になるときのx軸の値 %d \n", MX,mx); int cvWaitKey(int delay=10); //どこでとめるかをあらわす cvReleaseImage( &sourceImage ); cvReleaseImage( &grayImage ); cvReleaseImage( &binaryImage ); cvDestroyWindow( windowNameBinarization); return 0 ; }

  • セグメンテーション違反なってしまいます。

    LinuxでopenCVを使っているのですが、どうしてもセグメンテーション違反が出てしまいます。 画像の輪郭座標の表示をさせたいのですが、どうしたらセグメンテーション違反がとれるのでしょうか? ちなみにプログラムは、 #include<cv.h> #include<stdio.h> #include<cxcore.h> #include<highgui.h> #include<stdio.h> void GetContourFeature(CvSeq *Contour); #define THRESHOLD 10 #define THRESHOLD_MAX_VALUE 50 #define MIN_CONTOUR_COUNT 100 #define CONTOUR_MAX_LEVEL 1 #define LINE_THICKNESS 2 #define LINE_TYPE 8 //座標格納用変数 CvPoint *point; CvPoint pt[200000]; //制御点の座標 int main(int argc, char** argv) { char windowNameSource[]="Source"; char windowNameContour[]="Contour"; IplImage *sourceImage=cvLoadImage(arg[0],CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); if(sourceImage==NULL) { printf("画像が見つかりません\n"); return -1; } IplImage *grayImage=cvCreateImage(cvGetSize(sourceImage), IPL_DEPTH_8U,1); IplImage *binaryImage=cvCreateImage(cvGetSize(sourceImage),IPL_DEPTH_8U,1); IplImage *contourImage=cvCreateImage(cvGetSize(sourceImage),IPL_DEPTH_8U,3); cvCvtColor(sourceImage,grayImage,CV_BGR2GRAY); cvThreshold(grayImage,binaryImage,THRESHOLD,THRESHOLD_MAX_VALUE, CV_THRESH_BINARY); contourImage=cvCloneImage(sourceImage); CvMemStorage *storage = cvCreateMemStorage(0); CvSeq *contours=NULL; CvSize size = cvGetSize(sourceImage); //領域検出用の画像 IplImage* img_tmp = cvCreateImage(size,8,1); int contour_num = cvFindContours(binaryImage,storage, &contours,sizeof(CvContour),CV_RETR_LIST, CV_CHAIN_APPROX_NONE, cvPoint(0,0)); CvPoint ptMaxDist = cvPoint(-1,-1); double maxValue = 0.0; if(contour_num){ //距離変換画像 IplImage* img_dist = cvCreateImage(size,IPL_DEPTH_32F,1); IplImage* img_dist_norm = cvCreateImage(size,IPL_DEPTH_8U,1); //距離変換 cvDistTransform(binaryImage,img_dist,CV_DIST_L2,3,NULL,NULL); //0-255に正規化 cvNormalize(img_dist,img_dist_norm,0.0,255.0,CV_MINMAX,NULL); //最大距離の値と座標を取得する cvMinMaxLoc(img_dist,0,&maxValue,0,&ptMaxDist,0); cvReleaseImage(&img_dist); cvReleaseImage(&img_dist_norm); } //最大距離の点を持つ輪郭線を探す CvSeq* contour_max = NULL; if((ptMaxDist.x >= 0) && (ptMaxDist.x < size.width) && (ptMaxDist.y >= 0) && (ptMaxDist.y < size.height) && (maxValue > 0.0)) { cvZero(img_tmp); CvSeq* c = contours; for(contours=0;c != NULL;c = c -> h_next){ if(c -> total < MIN_CONTOUR_COUNT) continue; //この輪郭線を塗りつぶす cvDrawContours(img_tmp,c,cvScalarAll(255),cvScalarAll(255),CONTOUR_MAX_LEVEL,LINE_THICKNESS,LINE_TYPE,cvPoint(0,0)); //この領域に最大距離の点があるかどうか if(255.0 == cvGetReal2D( img_tmp, ptMaxDist.y, ptMaxDist.x)) { contour_max = c; break; } } cvReleaseImage(&img_tmp); } //この輪郭線を塗りつぶす cvDrawContours(contourImage,contour_max,CV_RGB(255,0,0),CV_RGB(255,0,0),CONTOUR_MAX_LEVEL,LINE_THICKNESS,LINE_TYPE,cvPoint(0,0)); int i; for (i=0;i < contour_max->total; i++){ point = CV_GET_SEQ_ELEM(CvPoint, contour_max, i); pt[i].x = point->x; pt[i].y = point->y; printf("(%d,%d)\n",pt[i].x,pt[i].y); } cvNamedWindow(windowNameSource, CV_WINDOW_AUTOSIZE); cvNamedWindow(windowNameContour, CV_WINDOW_AUTOSIZE); cvShowImage(windowNameSource,sourceImage); cvShowImage(windowNameContour,sourceImage); cvWaitKey(0); cvSaveImage("counter",contourImage); cvReleaseImage(&sourceImage); cvReleaseImage(&grayImage); cvReleaseImage(&contourImage); cvDestroyWindow(windowNameSource); cvDestroyWindow(windowNameContour); return 0; } です。よろしくお願いします。

専門家に質問してみよう