OpenCVでk-meansクラスタリングを実行する方法

このQ&Aのポイント
  • OpenCVを使用してk-meansクラスタリングを実行し、画像を分割および減色する方法について説明します。
  • サンプルコードを使用してk-meansクラスタリングを実装し、指定した画像をセグメント化します。
  • OpenCVのk-meansクラスタリングアルゴリズムを使用して画像の各ピクセルをRGBカラースペースでセグメント化し、各クラスタの中心を代表する色で画像を生成します。
回答を見る
  • ベストアンサー

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'って何なのでしょうか?どうやれば動かせるようになるか、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

サンプルプログラムでは、なにかの都合で、そのままでは使えないものがあります。 C/C++では、変数名や関数名等に半角英数以外の文字は使えない →¢記号は使えない文字ですから、プログラム自体が間違い 適切なものに変更する必要があります。 C/C++では、宣言していない変数や関数は使えない →~ersというものがどこかで宣言されているはずです。 同じファイル中のこともあれば、#includeで取り込んだファイル中のこともあります。 C/C++では、関数の引数に型が決まっている。型が違うとエラーになる。 →kmeans関数の引数を調べれば、~ersなるもの型がわかります。 そこで、リファレンスマニュアルを読むと http://opencv.jp/opencv-2.1/cpp/clustering_and_search_in_multi-dimensional_spaces.html#kmeans > double kmeans(const Mat& samples, int clusterCount, Mat& labels, TermCriteria termcrit, int attempts, int flags, Mat* centers) 該当する引数は、Mat型へのポインタだということがわかります。 Mat型のポインタ、ということは Mat* ~ers と宣言されたものか Mat ~ers と宣言したものを &演算子を付けて「 &~ers 」としたもののどちらか、になります。 この条件で探すと >Mat centers; という行があります。この後、centersが登場するのは >MatIterator_<Vec3f> itf = centers.begin<Vec3f>(); という行です。 宣言しただけで、特になんの操作もしていない centers をいきなり使うのはおかしいです。 この間になんらかの操作があると考えてよいでしょう。kmeansである可能性は十分に考えられます。 変数名も ~ers であり矛盾しません。 Mat型なので、 &centers としてkmeansの引数になっても矛盾しません。 HTMLの知識になりますが、 HTMLの実体参照に &cent; というのがあり、これがセント記号になります。;までが実体参照の書式なのですが、ときどき ;の無いものがあります。本来は、エラーなのですが、場合によっては ;を補って解釈してくれることもあります。 そう考えると、 &centers → &cent;ers → ¢ers となり、現在の状況と一致します。 以上から &centers としなければならないところが、文字化けして¢ersになった、と考えるのが妥当と思われます

その他の回答 (2)

  • hanmemomo
  • ベストアンサー率35% (205/580)
回答No.2

ken_tyan のが正解だな ソース中にコメントや文字列以外での 2バイト文字(またはそれ以上)は コンパイラーは常にエラーとみなしますので、 ¢ は間違いなく、書き間違いです。 &(変数の実体アドレス取り出し)などだと思われますね。 ということで、解決でしょう

noname#119957
noname#119957
回答No.1

コンパイルエラーですか? ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。 ソースコードに使用できない文字コードがあるからです。 ¢これは、もしかした、&ではありませんか?&ers cv.hの中や使用している、ライブラリ中にersという変数定義はありませんか? それにたいする参照かと思われますが。。

関連するQ&A

  • OpenCV2.2でのk-means法について

    プログラミング初心者です。 今回、OpenCV2.2を使って画像処理(クラスタリング)をk-means法で行うことになりました。 Visual C++で以下のサンプルコードをデバッグしてみたのですが実行できません。 #include "stdafx.h" #include "C:\\OpenCV2.2\\include\\opencv\\highgui.h" #include "C:\\OpenCV2.2\\include\\opencv\\cv.h" #include "opencv2\\opencv.hpp" using namespace cv; //int _tmain(int argc, _TCHAR* argv[]) 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] : "C:\Penguins.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, &centers); // (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; } デバッグすると、ウィンドウが一瞬だけ立ち上がってすぐに消えてしまいます。 最後に、 「プログラム '[2568] k-means1.exe: ネイティブ' はコード -1 (0xffffffff) で終了しました。」 のメッセージが残されています。 ソースにエラーがあるわけでもなさそうなので困っています。 何らかの対処法はあるのでしょうか?

  • OpenCv 透明度について

    OpenCv 透明度について 透明度を表すRGBAのA(アルファチャネル)をいじって画像の透明にしたいのですが、いじってみてもなにも変化がありません。 なにが悪いのかわかりません ↓こんな感じでやってます。 // 画像を読み込む src_img = cvLoadImage(src_imgfile,CV_LOAD_IMAGE_COLOR); //RGBA変換 dst_img = cvCreateImage(cvGetSize(bg_img),IPL_DEPTH_8U,4); cvCvtColor(bg_img,dst_img,CV_RGB2RGBA); //透明度をいじる for ( int y = 0 ; y < dst_img->height ; y++ ) { for ( int x = 0 ; x < dst_img->width ; x++ ) { dst_img->imageData[dst_img->widthStep * y + x * 4 + 3] = -255; } }

  • OpenCvのCvMatについて教えて下さい。

    いつもお世話になっております。 質問ですが、配列で画像のピクセル値(R,G,B)を行列に代入する場合は CvMat *points = cvCreateMat (size, 1, CV_32FC3); ピクセルの値を行列へ代入 for (i = 0; i < size; i++) { points->data.fl[i * 3 + 0] = (uchar) src_img->imageData[i * 3 + 0]; points->data.fl[i * 3 + 1] = (uchar) src_img->imageData[i * 3 + 1]; points->data.fl[i * 3 + 2] = (uchar) src_img->imageData[i * 3 + 2]; } のような流れでできますが、 これをピクセル値ではなく座標(x,y)を代入するにはどのように変更したらよいでしょうか。教えて下さい。

  • 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

  • パノラマ画像をプログラムで生成したいのですが...

    cv::Mat cv::Mat::operator ()(cv::Range,cv::Range) const' : 1 番目の引数を 'int' から 'cv::Range' に変換できません。(新しい機能 ; ヘルプを参照) 1> コンストラクタはソース型を持てません、またはコンストラクタのオーバーロードの解決があいまいです。 と表示されますが解決方法が分かりません プログラミング初心者のため分かりやすいご回答をお願いいたします 実行環境はMicrosoft Visual Studio 2008です //以下プログラム const char *WindowName = "view"; const char *WindowName2 = "view2"; //画像データの読込 IplImage* src_img = cvLoadImage("C:\\opencv\\samples\\c\\box1.jpg", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); if (src_img == NULL){ return 0; } IplImage* dst_img = cvLoadImage("C:\\opencv\\samples\\c\\box3.jpg", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); if (src_img == NULL){ return 0; } //変換 cv::Mat img1(src_img); cv::Mat img2(dst_img); //特徴点抽出用のグレー画像用意 cv::Mat grayImg1, grayImg2; cv::cvtColor(img1, grayImg1, CV_BGR2GRAY); cv::normalize(grayImg1, grayImg1, 0, 255, cv::NORM_MINMAX); cv::cvtColor(img2, grayImg2, CV_BGR2GRAY); cv::normalize(grayImg2, grayImg2, 0, 255, cv::NORM_MINMAX); cv::imshow ( WindowName, grayImg1 ); cv::imshow ( WindowName2, grayImg2 ); //SURF cv::SurfFeatureDetector detector(100); cv::SurfDescriptorExtractor extractor; //画像から特徴点を検出 std::vector <cv::KeyPoint> keypoints1; detector.detect(grayImg1, keypoints1); std::vector <cv::KeyPoint> keypoints2; detector.detect(grayImg2, keypoints2); //画像の特徴点における特徴量を抽出 cv::Mat descriptors1; extractor.compute(grayImg1, keypoints1, descriptors1); cv::Mat descriptors2; extractor.compute(grayImg2, keypoints2, descriptors2); //特徴点の対応付け std::vector<cv::DMatch> matches; cv::FlannBasedMatcher matcher; matcher.match(descriptors1, descriptors2, matches); // 対応点をstd::vectorに格納 std::vector< cv::Vec2f > points1( matches.size() ); std::vector< cv::Vec2f > points2( matches.size() ); for( size_t i = 0 ; i < matches.size() ; ++i ) { points1[ i ][ 0 ] = keypoints1[ matches[ i ].queryIdx ].pt.x; points1[ i ][ 1 ] = keypoints1[ matches[ i ].queryIdx ].pt.y; points2[ i ][ 0 ] = keypoints2[ matches[ i ].trainIdx ].pt.x; points2[ i ][ 1 ] = keypoints2[ matches[ i ].trainIdx ].pt.y; } // 画像間の平面射影変換行列を取得 cv::Mat_< float > homography = cv::findHomography( points1, points2, CV_RANSAC ); // 画像1を画像2の空間に投影 cv::Mat_< cv::Vec3b > result; cv::warpPerspective( grayImg1, result, homography,grayImg1.size(), grayImg1.rows ); // 画像2を結果画像にコピー for( int y = 0 ; y < grayImg2.rows ; ++y ) { for( int x = 0 ; x < grayImg2.cols ; ++x ) { result( y, x ) = grayImg2( y, x ); } } // モザイキング結果を表示 cv::imshow( "Mosaicing", result ); cv::waitKey();

  • 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; }

  • OpenCV2.4.6で色抽出を行いたい。

    Webカメラから取得した映像を用いて色抽出を行いたいです。 システム開発はVisual Studio 2012で言語はC++です。 OpenCV2.4.6を利用しているのですが、サンプルプログラムが古いバージョンで、OpenCV2.4.6では動かないので以下のプログラムを改良したいです。 参考にしたサイトはこちらです。 http://d.hatena.ne.jp/wah-wah-hawah/20090325/1237996168 以下プログラム #include <cv.h> #include <highgui.h> void GetMaskHSV(IplImage* src, IplImage* mask,int erosions, int dilations) { int x = 0, y = 0; uchar H, S, V; uchar minH, minS, minV, maxH, maxS, maxV; CvPixelPosition8u pos_src, pos_dst; uchar* p_src; uchar* p_dst; IplImage* tmp; tmp = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 3); //HSVに変換 cvCvtColor(src, tmp, CV_RGB2HSV); CV_INIT_PIXEL_POS(pos_src, (unsigned char*) tmp->imageData, tmp->widthStep,cvGetSize(tmp), x, y, tmp->origin); CV_INIT_PIXEL_POS(pos_dst, (unsigned char*) mask->imageData, mask->widthStep, cvGetSize(mask), x, y, mask->origin); minH = 100; maxH = 115; minS = 80; maxS = 255; minV = 120; maxV = 255; for(y = 0; y < tmp->height; y++) { for(x = 0; x < tmp->width; x++) { p_src = CV_MOVE_TO(pos_src, x, y, 3); p_dst = CV_MOVE_TO(pos_dst, x, y, 3); H = p_src[0]; //0から180 S = p_src[1]; V = p_src[2]; if( minH <= H && H <= maxH && minS <= S && S <= maxS && minV <= V && V <= maxV ) { p_dst[0] = 255; p_dst[1] = 255; p_dst[2] = 255; } else { p_dst[0] = 0; p_dst[1] = 0; p_dst[2] = 0; } } } if(erosions > 0) cvErode(mask, mask, 0, erosions); if(dilations > 0) cvDilate(mask, mask, 0, dilations); cvReleaseImage(&tmp); } int main(int argc, char **argv) { int c; CvCapture* capture = 0; IplImage* frame = 0; IplImage* mask = 0; IplImage* dst = 0; if(argc == 1 || (argc == 2 && strlen (argv[1]) == 1 && isdigit(argv[1][0]))) capture = cvCreateCameraCapture(argc == 2 ? argv[1][0] - '0' : 0); frame = cvQueryFrame(capture); mask = cvCreateImage(cvSize(frame->width, frame->height), IPL_DEPTH_8U, 3); dst = cvCreateImage(cvSize(frame->width, frame->height), IPL_DEPTH_8U, 3); cvNamedWindow("src", CV_WINDOW_AUTOSIZE); cvNamedWindow("dst", CV_WINDOW_AUTOSIZE); while(1) { frame = cvQueryFrame(capture); GetMaskHSV(frame, mask, 1, 1); cvAnd(frame, mask, dst); cvShowImage("src", frame); cvShowImage("dst", dst); c = cvWaitKey(10); if(c == 'q') break; } cvDestroyWindow("src"); cvDestroyWindow("dst"); cvReleaseImage(&frame); cvReleaseImage(&dst); cvReleaseImage(&mask); cvReleaseCapture(&capture); return(0); }

  • opencvのプログラムについて

    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); この部分で画像を取り込んでるのは分かるのですが、cvLoadImageの第一引数で画像を指定するんですよね?この場合はどの画像を読み込むのですか?

  • OpenCVでの画像読み込みについて

    OpenCVのファイルの読み込み部分がわからなくて困っています。 IplImage *src_img, *dst_img; if (argc < 2 || (src_img = cvLoadImage (argv[1], CV_LOAD_IMAGE_COLOR)) == 0) return -1; ここの処理は一体何を行っているのでしょうか? どのように動いているのか教えていただけないでしょうか? 一応調べた際、cvloadImage(ファイル名、状態)のようなことが書いてあったのでargv[1]を"test.jpg"に変更しても動きませんでした。

専門家に質問してみよう