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