画像処理プログラムを書こうとしていますが、いくつか問題があります。
形状のフィールド、回路(エッジ検出)、および必要なその他の変数をなんとか数えることができました。次に、各矢印がどの角度にあるのかを調べる必要があります。矢印の中心を探して、それを画像の重心と比較することを考えていました(そして、それらの間の線は角度になります。それがどのように行われるべきかはわかりません)。
問題は、それを実装する方法がわからないことです。設定された色で矢印を検出できましたが、それではエッジしか取得できませんでした。質量の中心を見つける方法(インターネットで情報を検索すると、実際にはさらに混乱しました)、各矢印の中心、または角度を数える方法がわかりません。
これらの角度を数えるのを手伝ってくれませんか? 私はすでにそれを行う方法のアイデアがありません。
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);
矢印付きの画像: