/* 按连通域分割图像 * image 图像数据 * i 寻找第一个不为0的点时寻找起始点所在行(寻找方向从左向右,从上向下) * j 寻找第一个不为0的点时寻找起始点所在列(寻找方向从左向右,从上向下) * imgSpArr 分离出的连通域数组 */ void splitImage(IplImage* image, int i, int j, ImageSplitArray* imgSpArr) { int ii, ji; for(ii=i; ii<image->height; ii++) { for(ji=j; ji<image->width; ji++) { if(image->imageData[ii*image->widthStep+ji] != 0) break; } j=0; if(ji < image->width && image->imageData[ii*image->widthStep+ji] != 0) break; } if(ii<image->height && ji<image->width) { PointsArray poiArr = {64, 0, (int(*)[2]) malloc (64*sizeof(int[2])), image->height, image->width, 0, 0}; //点(i,j)8邻域中的非零点所在行和列 PointsArray* ijs = &poiArr; ijs->pointArray[ijs->count][0] = ii; ijs->pointArray[ijs->count][1] = ji; image->imageData[ii*image->widthStep+ji] = 0; ijs->minI > ijs->pointArray[ijs->count][0] ? ijs->minI = ijs->pointArray[ijs->count][0] : ijs->minI = ijs->minI; ijs->minJ > ijs->pointArray[ijs->count][1] ? ijs->minJ = ijs->pointArray[ijs->count][1] : ijs->minJ = ijs->minJ; ijs->maxI < ijs->pointArray[ijs->count][0] ? ijs->maxI = ijs->pointArray[ijs->count][0] : ijs->maxI = ijs->maxI; ijs->maxJ < ijs->pointArray[ijs->count][1] ? ijs->maxJ = ijs->pointArray[ijs->count][1] : ijs->maxJ = ijs->maxJ; ++(ijs->count); findConnection(image, ijs, ii, ji); /*****如果imgSpArr内存不够,则将结构体数组长度+10*****/ if(imgSpArr->count >= imgSpArr->length) { imgSpArr->length += 10; ImageCon* tempImgCons = (ImageCon*)malloc(sizeof(ImageCon) * imgSpArr->length); for(int m=0; m<imgSpArr->count; m++) { ImageCon tempImgCon = {cvCreateImage(cvGetSize(imgSpArr->imgCons[m].img), imgSpArr->imgCons[m].img->depth, imgSpArr->imgCons[m].img->nChannels), imgSpArr->imgCons[m].minI, imgSpArr->imgCons[m].minJ, imgSpArr->imgCons[m].maxI, imgSpArr->imgCons[m].maxJ, imgSpArr->imgCons[m].aspectRatio, 0, 0}; tempImgCons[m] = tempImgCon; cvCopy(imgSpArr->imgCons[m].img, tempImgCons[m].img, NULL); cvReleaseImage(&(imgSpArr->imgCons[m].img)); } free(imgSpArr->imgCons); imgSpArr->imgCons = tempImgCons; } //imagesSplit[imagesSplit->count] = cvCreateImage(cvSize(image->width,image->height), image->depth, image->nChannels); ImageCon imgCon = {cvCreateImage(cvSize(ijs->maxJ-ijs->minJ+1, ijs->maxI-ijs->minI+1), image->depth, image->nChannels), ijs->minI, ijs->minJ, ijs->maxI, ijs->maxJ, 0.0f, 0, 0}; imgSpArr->imgCons[imgSpArr->count] = imgCon; cvZero(imgSpArr->imgCons[imgSpArr->count].img); imgSpArr->imgCons[imgSpArr->count].aspectRatio = (float)(ijs->maxI-ijs->minI+1) / (float)(ijs->maxJ-ijs->minJ+1); for(int m=0; m<ijs->count; m++) imgSpArr->imgCons[imgSpArr->count].img->imageData[(ijs->pointArray[m][0]-ijs->minI)*imgSpArr->imgCons[imgSpArr->count].img->widthStep+(ijs->pointArray[m][1]-ijs->minJ)] = (char)255; (imgSpArr->count)++; free(ijs->pointArray); //(*foregroundCounts)-=ijs->count; splitImage(image, ii, ji, imgSpArr); } }
StatWidget::StatWidget(const Game& rb): iRow(0), rb(rb) { setupUi(this); QImage wset( ":/setwhite.png" ); splitImage( wPieces, wset ); QImage bset( ":/setblack.png" ); splitImage( bPieces, bset ); QFont fixed; fixed.setFamily("Consolas"); bestLine->setFont(fixed); for (int i=0; i<256; i++) { pal[i] = QColor::fromHsvF(std::fmod(1.3-i/300.0, 1.0), 1.0, 1.0); } minipm[0][Rook] = ww1; minipm[0][Bishop] = ww2; minipm[0][Queen] = ww3; minipm[0][Knight] = ww4; minipm[0][Pawn] = ww5; minipm[0][King] = ww6; minipm[1][Rook] = wb1; minipm[1][Bishop] = wb2; minipm[1][Queen] = wb3; minipm[1][Knight] = wb4; minipm[1][Pawn] = wb5; minipm[1][King] = wb6; tree = new NodeModel(this); treeView->setModel( tree ); NodeDelegate* delegate = new NodeDelegate; treeView->setItemDelegate( delegate ); QTimer* t = new QTimer(this); connect(t, SIGNAL(timeout()), this, SLOT(update())); qRegisterMetaType<uint64_t>("uint64_t"); connect(&rb, SIGNAL(signalInfo(int, uint64_t, uint64_t, QString, QString)), this, SLOT (updateInfo(int, uint64_t, uint64_t, QString, QString))); t->setInterval(1000); t->start(); }
/* img input image return output image */ Mat Dip1::doSomethingThatMyTutorIsGonnaLike(Mat& img){ Mat newImg = img.clone(); splitImage(newImg, 0); splitImage(newImg, 3); //increase image contrast /// Do the operation new_image(i,j) = alpha*image(i,j) + beta float alpha = 1.2; int beta = 50; for( int y = 0; y < newImg.rows; y++ ){ for( int x = 0; x < newImg.cols; x++ ){ for( int c = 0; c < 3; c++ ){ newImg.at<Vec3b>(y,x)[c] = saturate_cast<uchar>( alpha*( newImg.at<Vec3b>(y,x)[c] ) + beta ); } } } return newImg; }
int main() { QString folder("C:\\Users\\Gigotdarnaud\\Desktop\\CircleTexturesHD"); QString outFolder("C:\\Users\\Gigotdarnaud\\Desktop\\CircleTexturesHD\\OUT"); QDir dir (folder); QStringList filters; filters << "*.bmp" << "*.png" << "*.jpg" << "*.tiff"; QStringList ls=dir.entryList(filters, QDir::Files|QDir::NoDotAndDotDot); QFile file(outFolder+'/'+"filelist.list"); file.open(QIODevice::WriteOnly|QIODevice::Text); QTextStream tstr(&file); int c=0; for(int i=0, m=ls.size();i<m;++i) { c+=splitImage(folder+'/'+ls[i], outFolder, tstr,c); } return 0; }