<実行した環境>
- Windows10 64bit
- visual studio 2017
- opencv 3.4.1
opencvの重心を求めるプログラムにopencvの関数ではない重心を求めるプログラムを入れたいです。
ただ質問するだけではただの投げやりなどと言われて嫌な気分になるので私なりに調べてきました。
#include <stdio.h> #include "opencv/cv.h" #include "opencv/highgui.h" using namespace cv; int main(){ Mat img = imread("sample.jpg", IMREAD_GRAYSCALE); Moments mu = moments( img, false ); Point2f mc = Point2f( mu.m10/mu.m00 , mu.m01/mu.m00 ); circle( img, mc, 4, Scalar(100), 2, 4); printf("x: %f y: %f", mc.x, mc.y); imshow("img",img); waitKey(0); return 0; }
以上のプログラムのmu.m10/mu.m00 , mu.m01/mu.m00の部分が重心を求める計算式であるとわかったので
この部分を以下の重心を求めるプログラムに置き換えたいのですが問題があります。
int count=0; double x_g=0.0,y_g=0.0,x_d=0.0,y_d=0.0,xy_d=0.0 for(int y=0; y<height; y++){ for(int x=0;x<width; x++){ if(img_src[y*width+x] == 255){ count++; x_g +=x; y_g +=y; } } } x_g /=conut; y_g/=count;
まず一つにMoments muのmuとPoint2f mcのmcが何を表しているか調べたのですがわかりませんでした。
また、Point2f( mu.m10/mu.m00 , mu.m01/mu.m00 ); と circle( img, mc, 4, Scalar(100), 2, 4);にmu、mcが入っていることからただ計算式を置き換えるだけでは意味がないと考えています。
しかし、どうやってmuとmcを考慮しながら計算式を置き換えてよいかわかりません。
どうか助言を頂けないでしょうか?
どうかよろしくお願いいたします。
<編集>
関数Point2fの使い方を調べようと本家の方で検索したのですが、例題としてPoint2f a(0.3f, 0.f), b(0.f, 0.4f);となり少なくともaとbの座標を二次元で表していることはわかるのですが、mcがなにを言っているのかわかりません。
調べたサイトはhttp://opencv.jp/opencv-2.1/cpp/basic_structures.htmlです。
できれば使い方のわからない関数がそのままの形で載っていればいいのですが、そうでない今回のような場合どのように調べればよいか教えていただけないでしょうか?
調べたサイトのようにPoint2f( m10/m00 , m01/m00 );と素直に座標だけ表せてくれればいいのですがなぜかmuが入ってPoint2f( mu.m10/mu.m00 , mu.m01/mu.m00 );となるので、どうやって座標のmuを考慮しながら計算のプログラムを入れるか悩みます。
多分muはPoint2f()より引数だと思うのですが、muが何を表しているのかわからず困り果てています。
編集6/10
<実行した環境>
- Windows10 64bit
- visual studio 2017
- opencv 3.4.1
ベストアンサー後に申し訳ありません。asm様からのプログラムを読んで学習のために自分なりにプログラムを作りました。
以下のプログラムをVS2017でビルドしたところエラーが出ました。
#include <stdio.h> #include <opencv/cv.h> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgcodecs/imgcodecs.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/core/core.hpp> using namespace cv; int main() { Mat img = imread("sample.jpg", IMREAD_GRAYSCALE); int count = 0; int conut = 0; double x_g = 0.0, y_g = 0.0; for (int y = 0; y<height; y++) { for (int x = 0; x<width; x++) { if (img_src[y*width + x] == 255) { count++; x_g += x; y_g += y; } } } int a; int b; a= x_g / conut; b= y_g / conut; Point2f mc = Point2f(a, b);//x_g / conutとy_g / conutをaとbと置いた。 circle(img, mc, 4, Scalar(100), 2, 4); printf("x: %f y: %f", mc.x, mc.y); imshow("img", img); waitKey(0); return 0; }
こちらがエラーなのですが
1>------ ビルド開始: プロジェクト: Project18, 構成: Release x64 ------ 1>Source.cpp 1>c:\users\daito\source\repos\project18\project18\source.cpp(16): error C2065: 'height': 定義されていない識別子です。 1>c:\users\daito\source\repos\project18\project18\source.cpp(17): error C2065: 'width': 定義されていない識別子です。 1>c:\users\daito\source\repos\project18\project18\source.cpp(18): error C2065: 'img_src': 定義されていない識別子です。 1>c:\users\daito\source\repos\project18\project18\source.cpp(18): error C2065: 'width': 定義されていない識別子です。 1>c:\users\daito\source\repos\project18\project18\source.cpp(30): warning C4244: '引数': 'double' から 'float' への変換です。データが失われる可能性があります。 1>プロジェクト "Project18.vcxproj" のビルドが終了しました -- 失敗。 ========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
インクルードしたヘッダファイルにheight、width、img_srcの定義は書いてあると思ったのですが、エラーが出るということは必要なヘッダファイルが入っていないのだと思います。
変数height、widthと関数img_srcの定義が書いてあるgithubはないでしょうか?
ヘッダファイルでも構いません。
どうかよろしくお願いいたします。
回答4件
あなたの回答
tips
プレビュー