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 回答