C++ 检测简单黑白图形图像中的直线、圆和圆弧

C++ 检测简单黑白图形图像中的直线、圆和圆弧,c++,algorithm,qt,opencv,image-processing,C++,Algorithm,Qt,Opencv,Image Processing,我试图在一个简单的黑白图形图像文件(jpg或bmp格式)中检测直线、圆和圆弧 我以前曾发布过一篇文章,其中建议使用OpenCV库。这是一个很好的图书馆,但是,对于我的目的来说,它不够准确。更具体地说,Canny检测算法在某种程度上并不适合我的图像 因此,我尝试使用QImage自己实现该算法。我已经成功地在直线上实现了它。Qt C++中的代码如下。这是一个非常混乱的代码,但我只是给它作为参考 算法非常简单: 1.我从左上角逐行扫描图像。 2.每当我遇到一个黑色像素,我都会朝着它的右、左底部扫描,以

我试图在一个简单的黑白图形图像文件(jpg或bmp格式)中检测直线、圆和圆弧

我以前曾发布过一篇文章,其中建议使用OpenCV库。这是一个很好的图书馆,但是,对于我的目的来说,它不够准确。更具体地说,Canny检测算法在某种程度上并不适合我的图像

因此,我尝试使用QImage自己实现该算法。我已经成功地在直线上实现了它。Qt C++中的代码如下。这是一个非常混乱的代码,但我只是给它作为参考

算法非常简单:
1.我从左上角逐行扫描图像。
2.每当我遇到一个黑色像素,我都会朝着它的右、左底部扫描,以检查它是否是线段的一个角

for ( int i = 0; i < myImage.height(); i++ ) {

        for ( int j = 0; j < myImage.width(); j++ ) {
            if ( qGray( myImage.pixel( j, i ) ) == 0 ) {

                myImage.setPixel( j, i, value );
                bool horiLineDrawn = false;
                int xRight = j+1, xLeft = j-1;
                int y = i+1;
                while ( xRight < myImage.width() && qGray( myImage.pixel( xRight, i ) ) == 0 ) {
                    myImage.setPixel( xRight, i, value );
                    xRight++;
                }
                while ( y < myImage.height() && xLeft >= 0 &&
                        qGray( myImage.pixel( xLeft, y ) ) == 0 ) {
                    if ( xLeft - 1 >= 0 &&
                         qGray( myImage.pixel( xLeft - 1, y ) ) == 0 ) {
                        while ( xLeft >= 0 &&
                                qGray( myImage.pixel( xLeft, y ) ) == 0 ) {
                            myImage.setPixel( xLeft, y, value );
                            xLeft--;
                        }
                        y++;
                    } else if ( y+1 < myImage.height() &&
                                qGray( myImage.pixel( xLeft, y + 1 ) ) == 0 ) {
                        while ( y < myImage.height() &&
                                qGray( myImage.pixel( xLeft, y ) ) == 0 ) {
                            myImage.setPixel( xLeft, y, value );
                            y++;
                        }
                        xLeft--;
                    } else {
                        xLeft--;
                        y++;
                    }
                }
                y--;
                xLeft++;
                if ( y > i && ( y - i > MIN_PIXELS_LINE ||
                                xRight-1 - xLeft > MIN_PIXELS_LINE )
                     ) {
                    drawFile.Line( fileName2, xRight-1, myImage.height() - i, xLeft,
                                   myImage.height() - y, 0 );
                    horiLineDrawn = true;
                }

                y = i + 1;
                while ( y < myImage.height() && xRight < myImage.width() &&
                        qGray( myImage.pixel( xRight, y ) ) == 0 ) {


                    if ( xRight + 1 < myImage.width() &&
                         qGray( myImage.pixel( xRight + 1, y ) ) == 0 ) {
                        while ( xRight < myImage.width() &&
                                qGray( myImage.pixel( xRight, y ) ) == 0 ) {
                            myImage.setPixel( xRight, y, value );
                            xRight++;
                        }
                        y++;
                    } else if ( y+1 < myImage.height() &&
                                qGray( myImage.pixel( xRight, y + 1 ) ) == 0 ) {
                        while ( y < myImage.height() &&
                                qGray( myImage.pixel( xRight, y ) ) == 0 ) {
                            myImage.setPixel( xRight, y, value );
                            y++;
                        }
                        xRight++;
                    } else {
                        xRight++;
                        y++;
                    }
                }
                y--;
                xRight--;
                if ( y - i > MIN_PIXELS_LINE || xRight - j > MIN_PIXELS_LINE
                     && !horiLineDrawn) {
                    drawFile.Line( fileName2, j, myImage.height() - i, xRight,
                                   myImage.height() - y, 0 );
                    horiLineDrawn = true;
                }

                y = i + 1;
                while ( y < myImage.height() && qGray( myImage.pixel( j, y ) ) == 0 ) {
                    myImage.setPixel( j, y, value );
                    y++;
                }
                xLeft = j - 1;
                xRight = j + 1;
                if ( xLeft >= 0 && y < myImage.height() &&
                     qGray( myImage.pixel( xLeft, y ) ) == 0 ) {
                    while ( xLeft >= 0 && y < myImage.height() &&
                            qGray( myImage.pixel( xLeft, y ) ) == 0 ) {
                        while ( y < myImage.height() &&
                                qGray( myImage.pixel( xLeft, y ) ) == 0 ) {
                            myImage.setPixel( xLeft, y, value );
                            y++;
                        }
                        xLeft--;
                    }
                    xLeft++;
                    y--;
                    if ( y - i > MIN_PIXELS_LINE || j - xLeft > MIN_PIXELS_LINE )
                        drawFile.Line( fileName2, j, myImage.height() - i, xLeft,
                                       myImage.height() - y, 0 );
                } else if ( xRight < myImage.width() && y < myImage.height() &&
                            qGray( myImage.pixel( xRight, y ) ) == 0 ) {
                       while ( xRight < myImage.width() && y < myImage.height() &&
                               qGray( myImage.pixel( xRight, y ) ) == 0 ) {
                           while ( y < myImage.height() &&
                                   qGray( myImage.pixel( xRight, y ) ) == 0 ) {
                               myImage.setPixel( xRight, y, value );
                               y++;
                           }
                           xRight++;
                       }
                       xRight--;
                       y--;
                       if ( y - i > MIN_PIXELS_LINE || xRight - j > MIN_PIXELS_LINE )
                           drawFile.Line( fileName2, j, myImage.height() - i, xRight,
                                          myImage.height() - y, 0 );
                } else {
                    y--;
                    if ( y - i > MIN_PIXELS_LINE )
                        drawFile.Line( fileName2, j, myImage.height() - i, j,
                                       myImage.height() - y, 0 );
                }


            }
        }
    }
for(int i=0;i=0&&
qGray(myImage.pixel(xLeft,y))==0){
如果(xLeft-1>=0&&
qGray(myImage.pixel(xLeft-1,y))==0){
而(xLeft>=0&&
qGray(myImage.pixel(xLeft,y))==0){
myImage.setPixel(xLeft,y,value);
xLeft--;
}
y++;
}如果(y+1i&(y-i>minu像素线)||
xRight-1-xLeft>最小像素(直线)
) {
drawFile.Line(fileName2,xRight-1,myImage.height()-i,xLeft,
myImage.height()-y,0);
horiLineDrawn=真;
}
y=i+1;
而(yMIN|u像素| xRight-j>MIN|u像素|线
&&!horiLineDrawn){
drawFile.Line(fileName2,j,myImage.height()-i,xRight,
myImage.height()-y,0);
horiLineDrawn=真;
}
y=i+1;
而(y=0&&y=0&&yMIN|u像素线| j-xLeft>MIN|u像素线)
drawFile.Line(fileName2,j,myImage.height()-i,xLeft,
myImage.height()-y,0);
}else if(xRight