0

画像処理プログラムを書こうとしていますが、いくつか問題があります。

形状のフィールド、回路(エッジ検出)、および必要なその他の変数をなんとか数えることができました。次に、各矢印がどの角度にあるのかを調べる必要があります。矢印の中心を探して、それを画像の重心と比較することを考えていました(そして、それらの間の線は角度になります。それがどのように行われるべきかはわかりません)。

問題は、それを実装する方法がわからないことです。設定された色で矢印を検出できましたが、それではエッジしか取得できませんでした。質量の中心を見つける方法(インターネットで情報を検索すると、実際にはさらに混乱しました)、各矢印の中心、または角度を数える方法がわかりません。

これらの角度を数えるのを手伝ってくれませんか? 私はすでにそれを行う方法のアイデアがありません。

DIBLOOK サンプルを使用しています。非標準のライブラリは使用できません。

このことに対する私の現在の機能は次のとおりです。

void CDibDoc::ConvertToGrayImage(CView *view)
{
trace("start ConvertToGrayImage\r\n");     
RGBTRIPLE* rows[500] ;
int width, height ;
int obwod=0;
int pole=0;
float w3=0.0;
float m00, m01, m02, m20, m10, m11;
float M01, M20, M11, M7, M02;

if( GetDIBRowsRGB(m_hDIB,rows,&width,&height)) {
for( int x=0;x<width;x++)
    for( int y =0;y<height;y++) {

        if(x<width-1 && x>0 && y<height-1 && y>0){      //count circuit, edge detection
        if(rows[x][y].rgbtBlue != rows[x+1][y].rgbtBlue || rows[x][y].rgbtBlue != rows[x][y+1].rgbtBlue ){
            obwod++; 
        }
        }

        if(rows[x][y].rgbtBlue == 0){    //count field
        pole++;

        m00+= 1;
        m01+= y;
        m02+= y*y;
        m20+= x * x;
        m10+= x;
        m11=+x * y;
        }                                 //counting variables for other things
        M02 = m02 - (m01*m01) / m00;
        M01 = m01 - (m01/m00) * m00;
        M11 = m11-m10 * m01 / m00;
        M20 = m20 - m10*m10 / m00;
        M7 = (M20*M02 - M11*M11)/(m00*m00*m00*m00);

    }

FreeDIBRows(m_hDIB);

w3 = (obwod / (2* sqrt((float)M_PI * pole))) -1;    //more counting


}
UpdateAllViews(NULL);  

矢印付きの画像:

ここに画像の説明を入力

4

1 に答える 1

0

これを行う最も簡単な方法は、矢印のエッジを検出した後、矢印の頭の点(p1)と矢印のボトムラインの中間点(p2)であるp1とp2の座標を簡単に計算できると思います。p1 座標が (x,y) と p2(x',y') であるとします。それを利用することで、矢印の正接を計算することができます。

tan 0 = (y' - y) / (x' - x)

これが役立つことを願っています

于 2013-06-18T15:47:16.520 に答える