C ++图像处理,计算对象的角度

时间:2013-05-19 12:12:03

标签: c++ image-processing

我正在尝试编写图像处理程序,但我遇到了一些问题。

我设法计算了形状的场,电路(边缘检测)和我需要的其他一些变量。 现在我需要找出每个箭头的角度。我正在考虑寻找箭头的中心,然后将其与图像的质心进行比较(它们之间的线条将是角度,我不确定它是否应该如何完成)。

问题在于我不知道如何实现它。我可以通过设置颜色来检测箭头,但这只能让我得到它们的边缘。我不知道如何找到一个质量中心(在互联网上搜索关于它的信息实际上让我更加困惑),每个箭头的中心或如何计算角度。

你可以帮我计算这些角度吗?我已经没有想法如何去做了。

我正在使用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);  

带箭头的图片:

enter image description here

1 个答案:

答案 0 :(得分:0)

我认为最简单的方法是,在检测到箭头的边缘后,您可以轻松计算出箭头(p1)和箭头中点(p2)的点p1和p2的坐标底线。假设p1坐标是(x,y)和p2(x&#39;,y&#39;)。通过使用它,您可以计算箭头的切线。

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

希望这会有所帮助