• ベストアンサー

OpenCVによる面積算出

OpenCVによる面積算出 現在OpenCVを使用して、2値化した画像を取得し保存。そして取得した画像を読み込み白い部分の面積を求めるプログラムを作成中なのですが、正直分かりません;; どのように作ればいいのか、OpenCvのプログラミングブックやGoogleで検索しても、自分で作成するに至れない状況です。もしよろしければ、アドバイス等をいただけると幸いです;;

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

  • ベストアンサー
  • kirinoma
  • ベストアンサー率53% (288/542)
回答No.1

こんばんは. 「白い部分の面積」というのは,「(連結している)白い部分の(個別の)面積」であると 仮定して回答させて頂きます. (でなければ,単純にカウンタ変数を用意した上で,画像を左上の画素から右下の画素まで読んでいって,値が0だったら無視,255だったらカウントアップ,で済む話です) それで,「連結している白い部分の個別の面積」を求める処理はラベリング処理といいます. わかりやすい概念図が下記ページに載っています. http://imagingsolution.blog107.fc2.com/blog-entry-193.html また,OpenCV用のラベリング関数を自作して公開してくれている人が居ます. http://oshiro.bpe.es.osaka-u.ac.jp/people/staff/imura/products/labeling 勉強のためではなく,急ぎならこちらを利用させてもらっても良いでしょう. 以上,参考になれば幸いです.

その他の回答 (1)

回答No.2

単純に画像全体の中から白い部分の面積(輝度値が0で無い部分の面積)を求めるのなら、cvCountNonZero関数を使うと一発で求められます。 ただし、OpenCV.jpにも書かれているように、この関数はシングルチャンネル(モノクロ画像)か、COI(処理するチャンネルが指定)されたマルチチャンネル(カラー画像)に対応なので、ご注意下さい。 それとも、IplImageの輝度データを直接参照したいのなら、過去に同じ様な質問があったので、そちらが参考になると思います。 http://okwave.jp/qa/q4743115.html もしくはkirinomaさんの回答のように、連結成分(ラベリングした領域)の面積を求めたいのなら、Googleで『cvFindContours 面積』で検索してもらうと参考になるページが見つかると思います。 http://www.google.co.jp/search?hl=ja&rlz=1B3GGGL_jaJP305JP305&q=cvFindContours+%E9%9D%A2%E7%A9%8D&aq=f&aqi=&aql=&oq=&gs_rfai= 以上、参考まで。

関連するQ&A

  • VB2010において面積の算出

    VisualBasic2010において、複数のPanelを用いて任意に図形を作成さたのですが、その作成させた図形(重複はない)の面積を算出したいと考えております。 使用したPanelの面積を足し合わせて、作成した図形の面積を算出させる。 座標を取得して面積を算出させる。 このどちらかの方法で作成させた図形の面積を算出できるのではないかと思うのですが、 Panelの面積を設定するにはどのようなコードを用いたらよいのかわからず、面積を足し合わせることができない。 頂点座標の取得法がわからない。 ため面積を算出することができません。 いろいろと調べてみたのですが、わかりませんでした。 もしお時間等ありましたら、お力添えをいただけると嬉しく思います。 どうかよろしくお願いします。

  • 【OpenCV】二値画像後、白の部分の面積を求める

    OpenCVで二値画像後、白の部分の面積を求めたいのですがどのようにしたらよいでしょうか? OS : Linux FedoraCore7

  • OpenCV1.1、OpenCV2.3の使い方

    これまでOpenCV1.1を使っていたのですが類似画像検索をするのにHOG特徴量を用いたいと思い、HOG特徴量を求める関数のあるOpenCV2.3もインストールしました。 その際、OpenCV1.1はアンインストールして、最初からプログラムを書き換えないとダメなのでしょうか?ためしに今まで書いていたプログラムにOpenCV2.3のライブラリをインクルードしてみると、それだけで100個以上のビルドエラーが発生してしまいました。CとC++の違いによるものなのでしょうか? あとPathの設定などもOpenCV1.1のときのものを残したまま、OpenCV2.3用のPathを追加しただけなのですが、大丈夫なのでしょうか? 解決方法がわかる方がいらっしゃれば、教えて下さい。よろしくお願いいたします。

  • VC++ 2010でOpenCVを使おうとしたら…

    こんばんは。 Win7のパソコンでOpenCVをVisual C++ 2010 Expressで使おうとしているものです。 パソコンについてあまり詳しくないため、質問させて頂きました。 OpenCVについて初心者なので、 「OpenCV プログラミングブック 第2版」という専門書を購入し、 書いてあるとおりにインストールや設定を行っていき、 この専門書のサポートHPに乗っているサンプルプログラムをコピーして、 「デバッグ開始」を選択して、さぁ実行してやろうという矢先に、 以下のメッセージが表示されて、進まなくなってしまいました。 「プログラム 'C:\Users\○○\documents\visual studio 2010\Projects\image\Debug\image.exe'を開始できません。 指定されたファイルが見つかりません。」(○○は私のユーザー名です。) 表示されたフォルダを確認してみたところ、確かにその場所にimage.exeなるものは 存在していませんでした。 これは、初期設定を行っている際に、この.exeが作成されないような 設定を行ってしまっているのでしょうか? 同じような症状、またはどうすれば改善できるか分かる方、 どうかご教授をお願い致します。 長文失礼致しました。

  • OpenCVを使って画像のノイズ除去を考えています

    OpenCVを使って画像のノイズ除去を考えています。 ですが、プログラムで上手く動いてくれないところがあり、分からなくて困っています。 もしわかる方がいらっしゃれば是非教えてください。 OpenCV2.4.6,VisualC++2010を用いています。 OpenCVを使わないLabeling.hなどを使った似たようなプログラムを教えてくださっても構いません。 ただ、Labeling.h自体がよくわからなく、Labeling.hを使って書いたプログラムが動かない状態であり、OpenCVの方がまだわかるので今回はOpenCVで質問しました。 プログラム(OpenCVを使った)の詳しい説明です。 入力画像の黒い点すべてがノイズだとします。またノイズのサイズは500以下だとします。 またサイズは特に指定はありません。拡張子は24bitのbmpを使っています。 画像の左側が入力画像とした時、画像の右側のように出力されます。(画像では分かりやすいように画像の切れ目を青の枠で囲っています。) 出力画像のふち?の部分が1ピクセルの範囲だけノイズ除去されずに残ってしまいます。(画像では分かりずらいですが赤の矢印の先の部分です。) 画像の下側のように赤のふち?1ピクセルの範囲はノイズ除去されません。 原因を考えているのですが、自分では分からなく困っています。 もしわかる方がいらっしゃれば是非教えてください。 私自身、プログラムは大学の授業レベル、OpenCVは使い始めて数ヶ月なので詳しくないです。 よろしくお願いします。 プログラムの内容は以下のようになっています。 〇〇〇は入力画像のファイル指定先 ●●●は出力画像のファイル指定先 ノイズのサイズは500以下とします。 自分は輪郭追跡のcvPointの部分が怪しいと考えてます。 今書いてるプログラムから一部抜き出してきたのでもしかしたら余計な処理が入っているかもしれません。 一応コピペでライブラリの設定、入力・出力画像のファイル指定をしていただくと動くと思います。 #include "stdafx.h" #include <stdio.h> #include "opencv/cv.h" #include "opencv/highgui.h" int _tmain(int argc, _TCHAR* argv[]) { IplImage *Proc;//処理画像 int i; char input_fname[256]; //元画像読み込み先 char output_fname[256]; //処理後画像出力先 //輪郭情報 CvMemStorage* Storage;//メモリストレージ CvSeq* Contours=0;//輪郭データ int Count=0;//輪郭の数 double Area=0;//面積 Storage=cvCreateMemStorage(0);//メモリストレージを確保 sprintf(input_fname, "〇〇〇"); sprintf(output_fname, "●●●"); IplImage *Input = cvLoadImage( input_fname, CV_LOAD_IMAGE_GRAYSCALE); if( Input == NULL ){ printf("ファイルが読み込めません。\n"); cvWaitKey(0); // キー入力待機 return -1; } // (1)二値化(大津の手法を利用) cvThreshold (Input, Input, 0, 255, CV_THRESH_BINARY_INV | CV_THRESH_OTSU);//大津の二値化を用いて色を反転させる Proc = cvCreateImage(cvGetSize(Input), Input->depth, 1);//処理画像 cvCopy(Input,Proc,NULL); //輪郭を取得 Count = cvFindContours(Proc,Storage,&Contours,sizeof(CvContour),CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE,cvPoint(0,0)); //輪郭情報の取得 for(i=1;i<=Count;i++){ Area=abs(cvContourArea(Contours));//面積 if(Area<500){//面積が500以下の場合、黒で塗りつぶす cvDrawContours( Input, Contours, CV_RGB(0,0,0),CV_RGB(0,0,0), 0, CV_FILLED);} Contours=Contours->h_next;//次の輪郭へ } cvThreshold (Input, Input, 0, 255, CV_THRESH_BINARY_INV | CV_THRESH_OTSU);//大津の二値化を用いて色を反転させる cvSaveImage(output_fname,Input);//矩形描画した画像を保存 //画像情報解放 cvReleaseImage(&Input); cvReleaseImage(&Proc); }

  • openCVのトラックバーについて

    OpenCV.jpのトラックバーのサンプルを使用して、トラックバーを複数個作りたいです。 サンプルにあるように2つの場合は、トラックバーと下の黒い部分が近いのですが、トラックバーを増やしていくと徐々に離れてしまいます(図)。 これは仕様でしょうか、それともプログラムで直せるものでしょうか。 分かる方、よろしくお願いします。 OpenCV.jpサンプルプログラム http://opencv.jp/sample/simple_gui.html#trackbar Cで作成しています。

  • opencvについて

    OpenCVの初歩のプログラムなんですが実行するとコマンドプロンプトと実行画面が出てきます。しかし実行画面には何も映りません。エラーも出ず、正しくビルドされています。使用しているwebカメラはMicrosoft社の「LifeCam VX-1000」です。初期設定も正しく設定しました。参考にしているものは、「OpenCV プログラミングブック 第2版」です。どなたかアドバイスお願いします。 プログラム↓ #include <stdio.h> #include <highgui.h> int main(int argc, char** argv) { CvCapture *capture; IplImage *frameImage; char windowNameCapture[] = "Capture"; capture = cvCreateCameraCapture(0); cvNamedWindow(windowNameCapture, CV_WINDOW_AUTOSIZE); while (1) { frameImage = cvQueryFrame(capture); cvShowImage(windowNameCapture, frameImage); if (cvWaitKey(33) == 'q') break; } cvReleaseCapture(&capture); cvDestroyWindow(windowNameCapture); return 0; }

  • openCVでのデバックエラー

    画像や動画の研究で、aviファイルから色の抽出などを行うためにIntelのopenCVを使用と考えています。 しかし、自作プログラムやopenCVに付属されているサンプルプログラムさえもデバックが失敗してしまい実行することができません。 OSはWindows Professional version2002のVisualC++ 2005で動かしています。 openCVは「OpenCV_b5a」を使用しています。 インストール時にVC++のインクルードファイルに C:\Program files\OpenCV\cv\include C:\Program Files\OpenCV\cvaux\include C:\Program Files\OpenCV\cxcore\include C:\Program Files\OpenCV\otherlibs\highgui ライブラリファイルに C:\Program files\OpenCV\lib を追加させました。 新しくプロジェクトを作成するたびに、リンカの入力に "cv.lib" "cxcore.lib" "cvaux.lib" "highgui.lib" "ipl.lib" を追加させプログラムを作っています。 しかし、デバックをするとすべてのプログラムにおいて、 'AAA.exe': 'C:\WINDOWS\system32\ntdll.dll' を読み込みました。シンボルが読み込まれていません。 'AAA.exe': 'C:\WINDOWS\system32\kernel32.dll' を読み込みました。シンボルが読み込まれていません。 ・・・・・・ と、シンボルが読み込まれていませんとエラーが沢山表示され、 プログラム '[2508] AAA.exe: ネイティブ' はコード -1 (0xffffffff) で終了しました。 と、失敗して困っています。 初心者ですが、この原因が分かる方いましたらどうぞご教授ください。

  • Xcode4へのOpenCVの設定

     OpenCVを用いて画像処理のプログラミングをしようと思っています.  今まではXcode3を用いていたのですが,もうアップグレードもしなくなりましたしそろそろXcode4へ移行していこうと思っています.そこで,OpenCVを使えるようにXcode4を設定しようと思っています.  現在のXcode3では,OpenCV.frameworkを設定して,「ヘッダ検索パス」「ライブラリ検索パス」などをいじってなんとか使えるようになっているのですが,まだまだ未熟で本当に正しい設定をしているのかもよくわからないような状態です><  Xcode4に同じように設定をした所,64ビットが何だとかなんとか...(英語でよくわからない><)  OpenCVをインストールし直してみようと思い立ちいろいろなサイトを調べてみました.MacPortsを用いたり,Homebrewを用いたりする方法が見つかりましたが,全てError...サイトに書いてある通りの手順を踏んだつもりですが全滅です.あとCMakeもインストールはしましたが,CMake Errorなどという警告が出てCMakeも使えないような状況です.  仕方なく,opencv.jpのサイトに行き手動でダウンロードして展開.  しかし,どのように設定すればXcode4で使えるのかよくわかりません.まだXcode4となると解説されているサイトもあまり見つからなくて...(T_T)  どなたかOpenCVをXcode4で用いる方法をご存知の方はいらっしゃらないでしょうか?  よろしくお願いします.  あと参考までに... 【OS】MacOS 10.8 (MountainLion)〈もっと前のOSからこの症状ですが...) 【Xcode】Version4.5 【OpenCV】OpenCV-2.4.2(とりあえず今回手動でダウンロードしたもの)  正常に動けばOpenCVのバージョンは何でもいいです><

  • OpenCVでマスク処理で「ぼかし」は可能か?

    インテルが提供しているOpenCVで画像処理を行う為に画面全体ではなく部分的にもしくは強弱を付けて「ぼかし」をかけたいのですがどの様に行えば良いのか分かりません。部分的に四角く行うにはROIなど使用すれば良いのですが、例えば円形や上下に向けて「ぼかし」が強くなる方法が分からないのです。添付しました画像のようなグラデーションで作成したマスク画像を利用してグラデーション色の強弱で「ぼかし」の強弱を付ける方法などないのでしょうか?どなかた分かる方がいましたらお手数ですがお知らせください。宜しくお願い致します。(OpenCVでは無理であればC++などで再現するサンプルプログラムなど掲載されているサイトなどでも構いません!)