• 締切済み

opencvについてわからないことがあります。

IplImage *frame, *img_gray, *img_out;//画像変数宣言 CvPoint pushpt[10]; int cnum; CvScalar color[10]; int _tmain(int argc, _TCHAR* argv[]) { int key=0; int wait=100; int newFrame=0; CvCapture* src; //ビデオキャプチャ宣言 CvVideoWriter* rec; //ビデオライタ宣言 void on_mouse(int event,int x,int y,int flags,void *param); cvNamedWindow ("入力映像");//表示ウインドウの作成 cvNamedWindow ("出力映像"); src = cvCaptureFromFile("movie.avi");//映像取得 cvSetMouseCallback("入力映像",on_mouse,0); if(src == NULL){//ファイルが読み込めない場合 printf ("canot open\n"); //cvWaitKey(0); return -1; } cnum=-1; newFrame=1; frame = cvQueryFrame(src);//初期フレーム取得 //画像領域の確保 //img_gray = cvCreateImage(cvSize(frame->width, frame->height), IPL_DEPTH_8U, 1); img_out = cvCreateImage(cvSize(frame->width, frame->height), IPL_DEPTH_8U, 3); //ビデオファイル書き込み設定 rec = cvCreateVideoWriter("movie_out.avi",CV_FOURCC('X','V','I','D'),30,cvSize(frame->width, frame->height)); for(int i=0;i<10;i++){//クリックした数だけiを増やして色を変える color[i]=CV_RGB((int)(255.0/10*(10-i)),(int)(255.0/10*i),0); } while(1){//映像が終了するまで繰り返す if(newFrame){ frame = cvQueryFrame(src);//1フレーム取得 cvCopy (frame,img_out,0); newFrame=0; } if(frame == NULL) break;//映像終了時 //cvLine(frame,cvPoint(50,50),cvPoint(100,100),CV_RGB(255,0,0),2,CV_AA,0); //draw mark for(int i=0;i<=cnum;i++){//クリックした数だけ円を描画 cvCircle(img_out,pushpt[i],10,color[i],2,CV_AA,0); } cvShowImage ("入力映像", frame);//1フレーム表示 cvShowImage ("出力映像", img_out); cvWriteFrame(rec ,img_out);//1フレーム書き込み key=0; key=cvWaitKey(wait);//key 'n'の入力を待つ if(key == 'n'){ cnum=-1; newFrame=1; } if(key==27) break;//escキーを押した時終了 } cvDestroyAllWindows();//すべての表示ウインドウ破棄 cvReleaseCapture(&src);//ビデオキャプチャの解放 cvReleaseVideoWriter(&rec);//ビデオライタの解放 cvReleaseImage(&img_gray);//画像領域の解放 cvReleaseImage(&img_out); return 0; } //追加 void on_mouse(int event,int x,int y,int flags,void *param){ //printf("OnMouseDown\n"); if(event == CV_EVENT_LBUTTONDOWN){ cnum++; if(cnum>10) cnum=10;//マークの最大点制限 pushpt[cnum] = cvPoint(x,y); printf("OnMouse:%d\n",cnum); //cvCircle(frame,pushpt,20,CV_RGB(255,128,0),8,CV_AA,0); } } このソースコードを実行すると、nキーで1フレーム進む動画が2つ表示されます。 1つは読み込んだ動画を表示しています。 もう1つはそれを録画して、動画ファイルとして書き出しています。 読み込んだ動画上にマウスでクリックすると、録画の画面上に丸でマークをします。 ここまではできました。 しかし、ここから次に書くことができません。 1フレーム目でマウスでクリックしてマークをします。 次に、nキーを押して2フレーム目に進みます。(この時1フレームでマークしたものは消えています。) そして、2フレーム目でマウスでクリックして、マークをすると1フレーム目でマークしたものが一緒に出てくる(できれば色が薄くなって) ということがしたいです。 pushptという配列に座標がはいっているのは、わかっているのですがどう書けばよいかわかりません。 教えてくださいお願いします。

みんなの回答

  • myuki1232
  • ベストアンサー率57% (97/170)
回答No.1

ただマークするだけなら配列を回せばいいだけです。 が、古いマークは薄くしようとするとアルファブレンドをしないといけないと思いますが、OpenCV にはアルファブレンドの専用の関数は無いようなので、自分で処理を書かないといけません。

関連するQ&A

  • 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のエラーが取れません。

    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; } //----------------------------------------------------- 解決方法など分かりましたら、よろしくお願いいたします。

  • OpenCVを用いたヒストグラムの比較について

     現在画像の類似度を求めるために、OpenCV1.0を使って色のヒストグラムの距離を求めるということを行っております。OpenCVで公開されているヒストグラム間の距離のサンプルプログラムを使って行っているのですが、結果があまり芳しくないためいろいろ調べなおしたところ、減色処理、量子化というワードにたどり着きました。  しかし調べてみてもいまいち分からず、行き詰っているのが現状です。どなたか減色処理や量子化について詳しい人がおりましたら、是非回答のほうよろしくお願いします。以下がOpenCVのコードなのですが、どこの部分をどのように変えたらそれが実現できるのかも是非回答お願いいたします。 #include <cv.h> #include <highgui.h> #include <math.h> #include <stdio.h> int main (int argc, char **argv) { char text[16]; int i, hist_size = 256, sch = 0; float range_0[] = { 0, 256 }; float *ranges[] = { range_0 }; double tmp, dist = 0; IplImage *src_img1 = 0, *src_img2 = 0, *dst_img1[4] = { 0, 0, 0, 0 }, *dst_img2[4] = { 0, 0, 0, 0}; CvHistogram *hist1, *hist2; CvFont font; CvSize text_size; // (1)二枚の画像を読み込む.チャンネル数が等しくない場合は,終了 if (argc >= 3) { src_img1 = cvLoadImage (argv[1], CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); src_img2 = cvLoadImage (argv[2], CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); } if (src_img1 == 0 || src_img2 == 0) return -1; if (src_img1->nChannels != src_img2->nChannels) return -1; // (2)入力画像のチャンネル数分の画像領域を確保 sch = src_img1->nChannels; for (i = 0; i < sch; i++) { dst_img1[i] = cvCreateImage (cvSize (src_img1->width, src_img1->height), src_img1->depth, 1); dst_img2[i] = cvCreateImage (cvSize (src_img2->width, src_img2->height), src_img2->depth, 1); } // (3)ヒストグラム構造体を確保 hist1 = cvCreateHist (1, &hist_size, CV_HIST_ARRAY, ranges, 1); hist2 = cvCreateHist (1, &hist_size, CV_HIST_ARRAY, ranges, 1); // (4)入力画像がマルチチャンネルの場合,画像をチャンネル毎に分割 if (sch == 1) { cvCopy (src_img1, dst_img1[0], NULL); cvCopy (src_img2, dst_img2[0], NULL); } else { cvSplit (src_img1, dst_img1[0], dst_img1[1], dst_img1[2], dst_img1[3]); cvSplit (src_img2, dst_img2[0], dst_img2[1], dst_img2[2], dst_img2[3]); } // (5)ヒストグラムを計算,正規化して,距離を求める for (i = 0; i < sch; i++) { cvCalcHist (&dst_img1[i], hist1, 0, NULL); cvCalcHist (&dst_img2[i], hist2, 0, NULL); cvNormalizeHis

  • 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で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での画像からの顔検出

    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 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の連続画像読み込みについて

    こんにちは。 連続画像の読み込みが出来なくて困ってます。 今まではVisualStudioを使い、読み込んでいたので IplImage* src_img = cvLoadImage("sample.bmp", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); if (src_img == NULL){ return 0; } のように書き直して動かしていたのですが http://opencv.jp/sample/initialization.html#combine の画像の連結のところで if (argc < 2) { return 1; } else { img_num = argc - 1; img = (IplImage **) cvAlloc (sizeof (IplImage *) * img_num); for (i = 0; i < img_num; i++) { img[i] = cvLoadImage (argv[i + 1], CV_LOAD_IMAGE_COLOR); if (img[i] == 0) return -1; } } ここをどのようにすれば連続画像を読み込めるようになるのか教えていただけないでしょうか。 よろしくお願いいたします。

  • opencv、プログラム初心者です。

    opencv、プログラム初心者です。 openCV2.0のサンプルコードで「k-meansクラスタリングによる画像分割,減色」とあります。サンプルは以下の通りです。 #include <cv.h> #include <highgui.h> using namespace cv; int main (int argc, char **argv) { const int cluster_count = 10; /* number of cluster */ // (1)load a specified file as a 3-channel color image const char *imagename = argc > 1 ? argv[1] : "../image/lena.jpg"; Mat src_img = imread(imagename); if(!src_img.data) return -1; // (2)reshape the image to be a 1 column matrix Mat points; src_img.convertTo(points, CV_32FC3); points = points.reshape(3, src_img.rows*src_img.cols); // (3)run k-means clustering algorithm to segment pixels in RGB color space Mat_<int> clusters(points.size(), CV_32SC1); Mat centers; kmeans(points, cluster_count, clusters, cvTermCriteria(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 10, 1.0), 1, KMEANS_PP_CENTERS, ¢ers); // (4)make a each centroid represent all pixels in the cluster Mat dst_img(src_img.size(), src_img.type()); MatIterator_<Vec3f> itf = centers.begin<Vec3f>(); MatIterator_<Vec3b> itd = dst_img.begin<Vec3b>(), itd_end = dst_img.end<Vec3b>(); for(int i=0; itd != itd_end; ++itd, ++i) { Vec3f color = itf[clusters(1,i)]; (*itd)[0] = saturate_cast<uchar>(color[0]); (*itd)[1] = saturate_cast<uchar>(color[1]); (*itd)[2] = saturate_cast<uchar>(color[2]); } // (5)show source and destination image, and quit when any key pressed namedWindow("src_img", CV_WINDOW_AUTOSIZE); imshow("src_img", src_img); namedWindow("dst_img", CV_WINDOW_AUTOSIZE); imshow("dst_img", dst_img); waitKey(0); return 0; } これをDebugしてみたのですが、 ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。 '¢ers' : 定義されていない識別子です。 と出てきます。'¢ers'って何なのでしょうか?どうやれば動かせるようになるか、よろしくお願いします。

  • openCVでの白黒画像読み込み

    いつも大変お世話になっております。 ピクセルの値を「ゼロ(黒)」にしたピクセルを読み込んでも「255(白)」となってしまい困っています。cvShowImageでこの画像を表示すると、どうみてもその場所は黒です。 なぜ「255(白)」になるのかわからず困っています。 原因を教えていただけませんでしょうか。 詳細は以下のとおりです。 out_imgという変数名のCV_LOAD_IMAGE_COLORの真っ白の画像 out_img = cvLoadImage("C:...\shiro.jpg", CV_LOAD_IMAGE_COLOR); の6×6ピクセルの値を、以下の文で「黒」にして    out_img->imageData[out_img->widthStep * 6 + 6 * 3] = 0;    out_img->imageData[out_img->widthStep * 6 + 6 * 3 + 1] = 0;    out_img->imageData[out_img->widthStep * 6 + 6 * 3 + 2] = 0; 保存し、再び(別のソリューションで)src_img変数としてこの画像を読み込み    src_img = cvLoadImage("C:...¥shiro.jpg", CV_LOAD_IMAGE_COLOR); グレースケール化し、       src_img_gray = cvCreateImage(cvGetSize(src_img), IPL_DEPTH_8U, 1); tmp_img = cvCreateImage(cvGetSize(src_img), IPL_DEPTH_8U, 1 ゼロイチの2値化(バイナリ画像)に変換し、 cvCvtColor(src_img, src_img_gray, CV_BGR2GRAY); 閾値でゼロイチに変換した後(なぜか上のsrc_img_grayでは黒がゼロにはならないため) cvAdaptiveThreshold(src_img_gray, tmp_img, 255, CV_ADAPTIVE_THRESH_GAUSSIAN_C, CV_THRESH_BINARY, 7, 8); 6×6の位置の値(変数iro)を確認すると「255」となります。 for (x = 0; x < tmp_img->width; x = x + 1){ // x 座標を 1ピクセルずつ進める for (y = 0; y < tmp_img->height; y = y + 1){ // y 座標を 1ピクセルずつ進める if (x == 6 && y == 6){ x = 6; (ここでデバックを掛けて、下の変数iroの値がいくつかを確認しています。ゼロであってほしいのですが、255です。 } uchar iro = tmp_img->imageData[tmp_img->widthStep * y + x * 3]; if (iro == 0){ 画像読み込みの引数がおかしいのだろうと思い、 CV_LOAD_IMAGE_ANYCOLOR や「0」にしたところ 今度はfor文のところでエラーになり、走査が始まりません。 for (x = 0; x < tmp_img->width; x = x + 1){ // x 座標を 1ピクセルずつ進める for (y = 0; y < tmp_img->height; y = y + 1){ // y 座標を 1ピクセルずつ進める 初歩的な質問で申し訳ありません。 ぜひアドバイスをいただけると助かります。 どうぞよろしくお願い致します。

専門家に質問してみよう