#include "aigoqt.h" #include #include #include "image.h" #define USESTATICIMAGE SDL_Surface *getSurface( void ) { static SDL_Surface *newSurface = NULL; if (newSurface == NULL) { qDebug() << "Now loading bmp..."; SDL_Surface *surface = SDL_LoadBMP("data/bilde.bmp"); newSurface = SDL_CreateRGBSurface(SDL_SWSURFACE, surface->w, surface->h, 8, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000); SDL_BlitSurface(surface, 0, newSurface, 0); delete surface; } return newSurface; } AigoQt::AigoQt(QWidget *parent) : QMainWindow(parent) { setupUi(this); #ifndef USESTATICIMAGE cam = new Quickcam("/dev/video0"); #endif timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(on_buttonDrawPoints_clicked())); timer->start(10); copy = Image::copySurface(getSurface()); } AigoQt::~AigoQt( void ) { #ifndef USESTATICIMAGE delete cam; #endif } void AigoQt::updateImage( void ) { #ifndef USESTATICIMAGE cam->update(); #endif SDL_Surface *s = getSurface(); if (checkThreshold->isChecked()) Image::threshold(s, blackImageThreshold->value(), whiteImageThreshold->value()); SDL_BlitSurface(s, NULL, copy, NULL); Mask::mask *mask = Mask::createCircleMask(19); //Mask::printMask(mask); if (checkErosion->isChecked()) Image::erosion(s, copy, mask); if (checkDilation->isChecked()) Image::dilation(s, copy, mask); delete mask; image->setPixmap(QPixmap::fromImage(QImage((uchar*)s->pixels, s->w, s->h, QImage::Format_RGB32))); //on_buttonGenerateState_clicked(); } void AigoQt::on_buttonSetCorners_clicked( void ) { disconnect(image, 0, 0, 0); connect(image, SIGNAL(clicked(int, int)), this, SLOT(handleCornerClicked(int, int))); statusBar()->showMessage("Please click the upper left corner of the board."); } void AigoQt::on_buttonGenerateState_clicked( void ) { State state = State::generateState(getSurface(), settings); state.printState(); } void AigoQt::on_sliderBlack_valueChanged( int value) { settings.setBlackThreshold(value); on_buttonGenerateState_clicked(); } void AigoQt::on_sliderWhite_valueChanged( int value) { settings.setWhiteThreshold(value); on_buttonGenerateState_clicked(); } void AigoQt::on_buttonDrawPoints_clicked( void ) { updateImage(); for (int i = 0; i < 19; i++) { for (int j = 0; j < 19; j++) { point p = State::positionPoint(i, j, settings); ((uint32_t*)getSurface()->pixels)[p.y*640 + p.x] = 0xffff0000; } } SDL_Surface *s = getSurface(); image->setPixmap(QPixmap::fromImage(QImage((uchar*)s->pixels, s->w, s->h, QImage::Format_RGB32))); } void AigoQt::handleCornerClicked( int x, int y) { point p; p.x = x; p.y = y; QString pointString = QString::fromLatin1("(%1, %2)").arg(x).arg(y); static int corner = -1; ++corner %= 4; switch (corner) { case 0: settings.setUL(p); statusBar()->showMessage("Upper left set to " + pointString + ". Click upper right."); break; case 1: settings.setUR(p); statusBar()->showMessage("Upper right set to " + pointString + ". Click bottom left."); break; case 2: settings.setBL(p); statusBar()->showMessage("Bottom left set to " + pointString + ". Click bottom right."); break; case 3: settings.setBR(p); statusBar()->showMessage("Bottom right set to " + pointString + ". All done."); disconnect(image, NULL, this, NULL); break; } } #include "aigoqt.moc"