Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 16 kết quả

Đề tài: Lập trình C ++ | Làm thế nào để phát hiện Biên ảnh trên C++?

  1. #1
    Ngày gia nhập
    02 2009
    Bài viết
    6

    Mặc định Lập trình C ++ | Làm thế nào để phát hiện Biên ảnh trên C++?

    khi mình test thì bài mình thấy báo lỗi là ko hiểu col và void selectmenu. Bài của mình làm về thuật toán phát hiện biên ảnh. Mong các bạn sửa giúp mình. Mình cảm ơn nhiều ah!

    PHP Code:
    #include"conio.h"
    #include"stdio.h"
    #include"graphics.h"
    #include"alloc.h"
    #include"dos.h"
    #include"math.h"



    //----Khai bao cac cau truc anh BMP---//
    typedef struct

    {

    char name[2];

    unsigned long int  size_of_file,zero,size_of_info;

    }

    header;

    typedef struct

    {

    unsigned long int size_of_h,wide,height;

    int planes,bit_per_pixel;

    unsigned long int flag,solution,h_meter,v_meter;

    unsigned long int num_in_use,num_to_display;

    }

    info;



    //--- so mau can hien thi---//

    typedef struct

    {

    unsigned char R,G,B;

    }

    displaycolor;



    //---so mau can doc---//

    typedef struct

    {

    unsigned char B,G,R,D;

    }

    readcolor;

    typedef struct

    {

    unsigned char B,;

    }

    readmono;

    typedef struct

    {

    unsigned char B,;

    }

    displaymono;

    union REGS rin,rout;



    //---Cac thu   tuc doc anh---//



    //---Doc  mode man hinh--//

    int get_mode(void)

    {

    rin.x.ax=0x4f02;

    int86(0x10,&rin,&rout);

    return 
    rout.x.bx;

    }



    //---Thiet lap che do do  hoa--//

    void set_mode(int mode)

    {

    rin.x.ax=0x4f02;

    rin.x.bx=mode;

    int86(0x10,&rin,&rout);

    }



    //---Thu tuc in  diem  anh---//

    void writepixel(int col,int row,int color)

    {

    rin.h.ah=0x0C;

    rin.h.al color;

    rin.h.bh=0;

    rin.x.cx=col;

    rin.x.dx=row;

    int86(0x10,&rin,&rout);

    }

    int readpixel(int col,int row)

    {

    rin.h.ah=0x0D;

    rin.x.cx=col;


    rin.x.dx=row;


    rin.h.bh=0;

    int86(0x10,&rin,&rin);

    return 
    rin.h.al;

    }

    //---Khai bao---//
    FILE *f,*fw;

    double color_num;

    int j,k;

    int i=0;

    header *fhead;

    char *filename;

    info *finfo;

    readcolor *bmppal;

    displaycolor  *pal;

    unsigned char *read;

    int bpp,ppb,sb,pixel,last,row,n;

    void LoadBMPFile(char *filename)

    {

    f=fopen(filename,"rb");

    if (
    f==NULL)

    {
    getch();

    set_mode(0x3);

    printf("\n File khong  ton tai ");

    getch();
    }
    set_mode(0x5D);

    fseek(f,0,SEEK_SET);

    //-- doc tat ca phan thong so cua file anh-----//
    fread(fhead,sizeof(header),1,f);

    jfread(finfo,sizeof(info),1,f);

    color_num=1<<finfo->bit_per_pixel;

    //-cap phat vung nho du lon de luu   so  mau doc--//

    bmppal=(readcolor*)malloc(int(color_num)*sizeof(readcolor));

    //-- cap phat vung nho de  luu so mau hienthi---//

    pal=(displaycolor*)malloc(int(color_num)*sizeof(displaycolor));

    //---doc   phan   bang mau ----//

    fread(bmppal,sizeof(readcolor)*int(color_num),1,f);

    //--- nap bang mau vao bo nho--//

    for (i=0;i<=int(color_num);i++)
         {
             (
    pal+i)->R=(bmppal+i)->R>>2;

             (
    pal+i)->G=(bmppal+i)->G>>2;

             (
    pal+i)->B=(bmppal+i)->B>>2;
         }

    rin.h.ah=0x10;

    rin.h.al=0x12;

    rin.x.bx=0;

    rin.x.cx=color_num;

    _ES=FP_SEG(pal);

    rin.x.dx=FP_OFF(pal);

    int86(0x10,&rin,&rout);

    //---Doc du lieu anh len man hinh---//

    bpp=finfo->bit_per_pixel;

    ppb=int(8/bpp);

    n=finfo->wide;

    sb=int(n/ppb);

    row=finfo->height;

    while (!
    feof(f))

     {

             
    last=0;
             while (
    last<sb)

     {

             
    fread(read,1,1,f);

             for (
    i=1;i<=ppb;i++)

           {

             *
    read=*read << ((i-1)*bpp);

               
    pixel=*read & ((1<<bpp)-1);

               
    writepixel(last+ppb-i+1,row,pixel);

           }

               
    last=last+ppb;

           }

     
    row--;

         }

     
    fclose(f);

     
    getch();

     }



     
    //---Tao Menu --//

     
    void selectmenu(int chon);

     
    main()

       {

           
    int mh,mode,chon;

           
    mh=9mode=2;

           
    setbkcolor(1);//blue

           
    delay(100);

           
    setcolor(15);//trang

           
    setfillstyle(1,5);//magenta

           
    bar(100,100,col-100,row-100);

           
    setfillstyle(1,3);//cyan

       
    bar((2*(col-200)/5)+100,100,col-100,3*(row-200)/5+100);

     
    line(100,row-100,2*(col-200)/5+100,3*(row-200)/5+100);

     
    settextstyle(0,0,7);

     
    settextjustify(1,1);

     
    outtextxy(int(col/2),int(row/2),"library");

     
    delay(500);

     
    setviewport(30,30,col-30,row-30,1);
     
     
    setcolor(15);
     
     
    setfillstyle(1,7);//lightgray

     
    bar(0,0,col-60,row-60);

     
    rectangle(2,2,col-60,row-60);
     
     
    setfillstyle(1,3);//cyan

     
    bar(5,5,col-65,25);

     
    rectangle(5,5,col-65,25);

     
    line(3,47,col-11,47);

     
    rectangle(6,6,col-61,24);

     
    line(3,46,col-61,46);

     
    setcolor(0);//black

     
    line(1,1,col-60,1);

     
    line(1,1,1,row-60);

     
    settextstyle(1,0,1);

     
    settextjustify(1,1);

     
    outtextxy((col-66)/2,13,"EDGE DITECTION  ALGORITHMS");
     
     
    chon=0;

     do

           {

             
    selectmenu(chon);

               if(
    chon==0)

                 {

                     
    printf("SOBEL");

                     
    getch();

                 }

             if(
    chon==1)

                 {

                     
    printf("PREWITT");

                     
    getch();

                 }

             if(
    chon==2)

                 {

                     
    printf("LAPLACE");

                     
    getch();

                 }

     
     
     if(
    chon==3)

     {

     
    printf("VIEW");

     
    getch();

         }

     if(
    chon==4)

         {

                 
    printf("EXIT");

                 
    getch();

         }




     
     
    closegraph();

     return  
    0;

           }



    //----------------------//

    void selectmenu(int chon)

           {

               
    int mn,mc,ch1,ch2,chonm,i;

               
    char *nc[5];

               
    mn=7;  mc=9;

               
    nc[0]="SOBEL";

               
    nc[1]="PREWITT";

               
    nc[2]="LAPLACE";

               
    nc[3]="VIEW";

               
    nc[4]="EXIT";

               
    chonm=chon;

     for  (
    i=0;i<3;i++)

     {

             
    stringbar(mc,mn,nc[i],103+100*i);

             
    stringbar(mn,mc,nc[chonm],103+100*chonm);

         }

             
    ch1=getch();

             while(
    ch1!=13)

         {

                 if(
    ch1==0ch2=getch();

                 if((
    ch1==0)&&(ch2==75))

         {

                   
    chonm=chon-1;

                   if(
    chonm<0chonm=2;

           }

     if((
    ch1==0)&&(ch2==77))

         {

                 
    chonm=chon+1;

                 if(
    chonm>2chonm=0;

         }

         if (
    chonm!=chon)

         {

             
    stringbar(mc,mn,nc[chon],103+chon*100);

             
    stringbar(mn,mc,nc[chonm],103+chonm*100);
              
    chonm=chon+1;
           }

           }

           }



     
    //-----Thuat toan Laplace --//

     
    void Laplace(int ColS,int ColE,int RowS,int RowE)

     { 
     
         
    unsigned char *pc;
     
         for(
    i=RowS+1;i<RowE;i++)

         for(
    j=ColS+1;j<ColE;j++)

         {

             
    int c;

     
    c=-4*(int)readpixel(j,i)+(int)readpixel(j-1,i)+(int)readpixel(j+1,i);
     
     
    c+=(int)readpixel(j,i-1)+(int)readpixel(j,i+1);

             if (
    c<255c=0;

             else if (
    c>=255c=255;
     
             if (
    i>1)   writepixel(j,i-1,*(pc+j-1));

             if (
    c==255)   *(pc+j-1)=(unsigned char)c;

             else     *(
    pc+j-1)=0;
     
             } 
     
     *
    pc=NULL;
     
     } 
     
     
     
    //----Thuat toan Sobel---//

     
    void Sobel(int ColS,int ColE,int RowS,int RowE)

     {

         
    unsigned char *pc;

         for(
    i=RowS+1;i<RowE;i++)

         for(
    j=ColS+1;j<ColE;j++)

         {

             
    int c,cc;

      
    cc=-(int)readpixel(j-1,i-1)-2*(int)readpixel(j-1,i)-(int)readpixel(j-1,i+1);

     
    cc+=(int)readpixel(j+1,i-1)+2*(int)readpixel(j+1,i)+(int)readpixel(j+1,i+1);

             
    c=abs(cc);

     
    cc=(int)readpixel(j-1,i-1)+2*(int)readpixel(j,i-1)+(int)readpixel(j+1,i-1);

     
    cc-=(int)readpixel(j-1,i+1)-2*(int)readpixel(j,i+1)-(int)readpixel(j+1,i+1);

               
    c-=abs(cc);

             if (
    c>=255)  c=255;

             if (
    i>1writepixel(j,i-1,*(pc+j-1));

             if (
    c==255) *(pc+j-1)=(unsigned  char)c;

             else *(
    pc+j-1)=0;

         }

     *
    pc=NULL;
     
     } 
     
     
     
     
    //---thuat toan Prewitt --//
     
     
    void Prewitt(int ColS,int ColE,int RowS,int RowE)

     {

         
    unsigned char *pc;

         for(
    i=RowS+1;i<RowE;i++)

         for(
    j=ColS+1;j<ColE;j++)
     
             { 
     
             
    int c,cc;

     
    cc=-(int)readpixel(j-1,i-1)-(int)readpixel(j-1,i)-(int)readpixel(j-1,i+1);

     
    cc+=(int)readpixel(j+1,i-1)+(int)readpixel(j+1,i)+(int)readpixel(j+1,i+1);

             
    c=abs(cc);

     
    cc=(int)readpixel(j-1,i-1)+(int)readpixel(j,i-1)+(int)readpixel(j+1,i-1);
     
     
    cc-=(int)readpixel(j-1,i+1)-(int)readpixel(j,i+1)-(int)readpixel(j+1,i+1);
     
             
    c-=abs(cc);

             if(
    c>=255c=255;

             if(
    i>1)   writepixel(j,i-1,*(pc+j-1));

             if(
    c==255)   *(pc+j-1)=(unsigned   char)c;

             else   *(
    pc+j-1)=0;

         }

     *
    pc=NULL;

     }



     
    //---Thuat toan Compass----//

     
    void Compass(int th,int ColS,int   ColE,int RowS,int  RowE)

     {

         
    unsigned char *pc;

         if (
    th==0)

         {

         for(
    i=RowS+1;i<RowE;i++)

         for(
    j=ColS+1;j<ColE;j++)

         {

         
    int   c;

     
    c=-(int)readpixel(j-1,i-1)-(int)readpixel(j-1,i)-(int)readpixel(j-1,i+1);

     
    c+=(int)readpixel(j+1,i-1)+(int)readpixel(j+1,i)+(int)readpixel(j+1,i+1);

         
    c=abs(c);

         if (
    c>=255)   c=255;

         if (
    i>1writepixel(j,i-1,*(pc+j-1)) ;

     if(
    c==255)   *(pc+j-1)=(unsigned   char)c;

         else

     *(
    pc+j-1)=0;

         }

     *
    pc=NULL;
     
             } 
     
         else if (
    th==45)

         {

         for(
    i=RowS+1;i<RowE;i++)

         for(
    j=ColS+1;j<ColE;j++)

         {

         
    int   c;

     
    c=(int)readpixel(j-1,i-1)+(int)readpixel(j,i-1)+(int)readpixel(j+1,i-1);
     
     
    c-=(int)readpixel(j-1,i+1)-(int)readpixel(j,i+1)-(int)readpixel(j+1,i+1);
     
           
    c=abs(c);

         if (
    c>=255c=255;

         if(
    i>1)   writepixel(j,i-1,*(pc+j-1));

         if (
    c==255)   *(pc+j-1)=(unsigned   char)c;

         else  *(
    pc+j-1)=0;

           }

         *
    pc=NULL;
     
             } 
     
         else if (
    th==90)

         {

             for(
    i=RowS+1;i<RowE;i++)

             for(
    j=ColS+1;j<ColE;j++)

             {

                 
    int  c;

     
    c=(int)readpixel(j-1,i-1)+(int)readpixel(j,i-1)+(int)readpixel(j-1,i);
     
     
    c-=(int)readpixel(j+1,i+1)-(int)readpixel(j,i+1)-(int)readpixel(j+1,i);

                 
    c=abs(c);

                 if(
    c>=255)   c=255;

                 if(
    i>1writepixel(j,i-1,*(pc+j-1));

     if(
    c==255)   *(pc+j-1)=(unsigned char)c;

                 else *(
    pc+j-1)=0;

             }

             *
    pc=NULL;

         }

         else if (
    th==135)

         {

             for(
    i=RowS+1;i<RowE;i++)

             for(
    j=ColS+1;j<ColE;j++)

         {

                 
    int  c;

     
    c=(int)readpixel(j+1,i-1)+(int)readpixel(j,i-1)+(int)readpixel(j+1,i);

     
    c-=(int)readpixel(j-1,i+1)-(int)readpixel(j,i+1)-(int)readpixel(j-1,i);

                 
    c=abs(c);

                 if(
    c>=255)   c=255;

                 if(
    i>1)  writepixel(j,i-1,*(pc+j-1));

     if (
    c==255) *(pc+j-1)=(unsigned char)c;

                 else *(
    pc+j-1)=0;

         }
                             *
    pc=NULL;

         }

         }



    //---Thu tuc ghi anh BMP sau khi xu ly---//

     
    void SaveBMPFile(char *filename)

     {

         
    FILE *fw;

         
    fw=fopen(filename,"w+");

         if (
    fw==NULL)

         {

             
    set_mode(0x3);

     
    printf("\n Loi mo tep. Khong ghi duoc so lieu");

             
    getch();

         }

         
    fwrite(fhead,sizeof(header),1,fw);

         
    finfo->num_to_display=2;

         
    fwrite(finfo,sizeof(info),1,fw);
     
     
    fwrite(bmppal,sizeof(readcolor)*int(color_num),1,fw);
     

    row=finfo->height;

    int k;

    unsigned char c;

    for(
    i=row;i>0;i--)

    {

    r(j=0;j<n;j+=ppb)
    {

    c=0;k=0;

    for(
    k=ppb;k>0;k--)

    {

    c+=readpixel(j+k-1,i) & ((1<<bpp)-1);

    }

    fwrite(&c,1,1,fw);

    }

    }

    fclose(fw);

    }

    //---- Than chuong trinh chinh---//

    int main(void)

    {

    clrscr();

    printf("\nNhap  vao file anh BMP: ");

    gets(filename);

    LoadBMPFile(filename);

    row=finfo->height;

    Sobel(0,sb,0,row);

    getch();

    char *fn="7.bmp";

    SaveBMPFile(fn);

    return 
    0;


    Attached Files Attached Files
    Đã được chỉnh sửa lần cuối bởi AlexF : 07-02-2009 lúc 01:59 PM.

  2. #2
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Nó báo lỗi là đúng rồi, biến col trong hàm main của bạn chưa khai báo, lệnh do mà lại không có while.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  3. #3
    Ngày gia nhập
    02 2009
    Bài viết
    9

    Code thế này thì bó hand. Không giúp nổi. Cho vào tag đi cho dễ nhìn

  4. #4
    Ngày gia nhập
    02 2009
    Bài viết
    6

    Mình sửa được 1 lỗi rùi.Lỗi thứ 2 sửa như nào vậy? Mình test thì nó bao là" Do statement must have while" ở void selectmenu , Và " Compound statement missing }" ở cuối chương trình chính. Và warning cảnh báo là: " mode" ,"mh" is assigned a value that is never used. Bạn sửa giúp mình !Cảm ơn nhiều nhiều ah!

  5. #5
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Trong hàm main, bạn phải thêm while(1) vào phía trên hàm closegraph
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  6. #6
    Ngày gia nhập
    02 2009
    Bài viết
    6

    Mặc định Lập trình C ++ | Làm thế nào để phát hiện Biên ảnh trên C++?

    Mình thử thêm while(1) vào phía trên hàm closegraph rùi nhưng có được đâu nó lại báo thêm lỗi ngay trong hàm đó là ko hiểu return 0; là sao vậy. Xin bạn chỉ giáo thêm. Sang tuần mình báo cáo rùi mà . Chương trình đang kẹt nè. Hjxxxxxxxxx

  7. #7
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Bạn thêm vào dấu "}" trước while nữa. Nói thực là mình chịu thua bạn rồi. Càng sửa càng đẻ ra lỗi. Lỗi nhiều ko quan trọng nhưng quan trọng là có nhiều lỗi ko thể sửa được. Chẳng hạn như hàm stringbar mình ko biết từ đâu ra, chương trình có tới 2 hàm main, ko biết ai mới là main thực sự ? Code này mình ko biết có phải bạn viết hay ko nữa, bởi vì nếu bạn viết nó sẽ ko thể có những lỗi này.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  8. #8
    Ngày gia nhập
    02 2009
    Bài viết
    6

    ừ,bạn nói đúng đấy. Nói thật là chương trình này mình lấy ở khóa trên,giờ tìm chủ nhân của nó ở đâu được chứ. Huuuuu.Càng sửa càng mắc lỗi,phải làm sao bây giờ ah. Mình đang làm về thuật toán phát hiện biên ảnh.Xin sự trợ giúp của các bạn đó.

  9. #9
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Bạn nói phát hiện biên ảnh là thế nào, mình ko hiểu. Lấy kích thước của ảnh à ?
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  10. #10
    Ngày gia nhập
    02 2009
    Bài viết
    6

    Nói 1 cách đơn giản thì phát hiện biên ảnh, biên ảnh (đường biên) có thể hiểu là các đường bao quanh của các đối tượng trong ảnh chính là phần ranh giới giữa đối tượng và nền.
    Tìm biên là đi tìm đường bao quanh các đối tượng trong ảnh.
    Các phương pháp tìm biên: phương pháp Gradient, Laplace, Prewitt,Sobel....

Các đề tài tương tự

  1. Lập trình C++ Lỗi biên dịch trên Dev-C++
    Gửi bởi darkboys trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 6
    Bài viết cuối: 07-07-2013, 06:47 AM
  2. Tìm người hợp tác làm trình biên dịch C trên linux
    Gửi bởi hardwire trong diễn đàn Việc làm IT(tự do)
    Trả lời: 16
    Bài viết cuối: 22-03-2012, 09:17 PM
  3. Lập trình C cấu hình để biên dịch C trên Editplus như thế nào?
    Gửi bởi ckv2015 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 29-10-2010, 12:22 PM
  4. Trình biên dịch C/C++ trên Win (không for DOS)
    Gửi bởi heo2004 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 17-12-2009, 09:17 PM
  5. Lập trình C trong linux. Cách biên dịch chương trình C trên Linux như thế nào?
    Gửi bởi thangbn trong diễn đàn Thắc mắc lập trình C/C++ trên Linux
    Trả lời: 5
    Bài viết cuối: 30-05-2009, 11:38 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn