Xác định các khoảng ảnh có thể tìm được điểm tô:

Một phần của tài liệu luận văn công nghệ thông tin thiết kế hệ thống nhập điểm tự động - svth trần viết khôi (Trang 41)

5. Xác định điểm tô đen :

5.2. Xác định các khoảng ảnh có thể tìm được điểm tô:

Do bảng điểm có 30 thí sinh và 11 cột điểm dẫn đến khoảng điểm mà chứa các điểm này thì rất lớn do đó ta không thể nào đọc một lần hết khoảng điểm đó vào bộ nhớ để xử lý. Cho nên ta phải cắt nhỏ khoảng điểm đó ra thành các khoảng nhỏ hơn mỗi khoảng chứa 6 thí sinh dẫn đến việc thay vì ta xử lý một khoảng điểm lớn không khả thi ta lại xử 5 lần khoảng điểm nhỏ để tìm ra điểm và vị trí của khoảng điểm lớn.

Do ảnh điểm là một sản phẩm thủ công như đã nói ở trên dẫn đến khả năng ảnh có thể bị quay theo nhiều hướng khác nhau. Do đó nếu ta đọc phần ảnh như trên thì có khả năng khi ảnh quay các ô điểm ở vị trí 0 hoặc 10 và các thí sinh nằm ở vị trí số 1 hoặc số 6 có thể không rơi vào trong khoảng điểm của ta dẫn đến ta có thể nhận dạng thiếu hoặc sai các vị trí không rơi vào khoảng ảnh. Sự ảnh hưởng này rất dễ xảy ra với các phần điểm nằm ở vị trí sau.

Để khắc phục được điều này ta đưa ra giải pháp là đọc ảnh rộng hơn bình thường nghĩa là các ảnh sẽ đọc rộng hơn bình thường 24 pixel thì ta có thể đọc được toàn bộ thông tin của phần ảnh bị quay với một góc quay nhỏ.

Nhưng nếu ảnh bị quay một góc lớn (3 đến 6 độ) thì những phần ảnh càng về sau càng bị lệch và khả năng lệch đó có thể làm mất các điểm và vị trí ở biên. Để khắc phục điều này ta phải có các biến để tính độ dời theo hai trục khi ảnh bị quay. Sau đây là công thức tính độ dời hai trục khi ảnh quay:

DoDoi = sin(a) *100 DoDoix=DoDoiy=DoDoi If (dodoi<-5 and dodoi>5) then Begin

DoDoiy = (DoDoi/6)*24 DoDoix = Dodoi*2 End

Sau đây công thức để tính khoảng ảnh có các điểm tô: dy = 23 * 6

xa = 387 + xmt1 ya = 116 + ymt1 xb = 612 + xmt1 yb = 164 + ymt1 đối với mỗi khoảng ảnh

xa = xa + DoDoix xb = xb + DoDoix

ya = ya + dy * số lần dời – DoDoiy yb = yb + dy * (số lần dời +1) - DoDoiy 5.3.Giải pháp để xác định tâm của điểm tô :

Điểm tô là một điểm được tô thủ công do đó hình dạng và kích thước của chúng hoàn toàn không thể xác định được. Ngoài ra các điểm tô đôi khi lại có các khoảng trắng ở giữa, các khoảng trắng ở hai bên của ô để tô … ngoài ra các ô tô đen còn có các số ở bên trong điều này khiến cho chương trình dễ nhầm lẫn các ô tô đen với các ô có số này ( do bộ lọc của ta được thiết kế để lọc cho nhiều bức ảnh scan khác nhau do đó khoảng màu của chúng tương đối rộng dẫn đến đối với những bức ảnh Scan có màu đậm thì các ô không được tô đen có khả năng rơi vào trong khoảng lọc của ta).

Để khắc phục được điều này ta đưa ra giải pháp là tăng trọng số để xác định điểm đen vượt qua trọng số điểm đen của các ô không tô. Giải pháp này khắc phục được tình trạng nhận sai điểm đối với những bức ảnh scan đậm nhưng đối với những bức ảnh Scan nhạt thì với trọng số cao nhưng trên thì có khả năng các điểm tô có thể không được nhận ra.

Để khắc phục những điều trên đã đưa đến một giải pháp lấy khoảng trọng số để xác định điểm tô ở mức trung bình của các điều trên và dùng một số điều kiện để loại bỏ các ô không được tô đen.

Ví dụ: để loại bỏ các ô có chữ số 0,1,2,3,4,5,6,7 thì ta dùng điều kiện là nếu có 4 khoảng trắng liên tiếp thì ta loại.

Hoặc để loại các ô có chữ số 8,9,10 ta dúng điều kiện là nếu có 3 khoảng trắng đen liên tiếp thì ta loại…

Hoặc để giải quyết điều trên ta đưa ra một giải pháp loại trừ , là để không bị nhầm lẫn thì ta sẽ loại bỏ cái điều mà gây ra nhầm lẫn đó là ta loại bỏ các chữ số trong ô điểm tô thì vấn đề sẽ được khắc phục hoàn toàn.

Sau đây là giải pháp để xác định điểm tô trong khoảng điểm:

Tìm tuần tự trên khoảng điểm nếu gặp pixel đen thì tiến hành kiểm tra xem kiểm tra xem pixel đen đó có thuộc điểm tô hay không nếu có thì ghi nhận tâm của điểm tô và nhảy xuống 10 dòng để bắt đầu tìm tiếp.

Để kiểm tra một pixel đen có thuộc điểm tô đen hay không ta tiến hành quét đóng khung như kiểm tra ở phần mốc nhưng có thêm một số điều kiện như đã nêu ở trên.

Ngoài ra ta phải sử dụng một số cách sau để xác định điểm tô đen :  Khi quét đến đâu thì ta đưa dự liệu của pixelđó về giá trị 0.

 Kiểm tra số pixel có giá trị bằng 0 trên một hàng được bao bởi các pixel có trá trị bằng 1, nếu số pixel đó đạt giá trị từ 6 trở lên thì ta sẽ không kiểm trả khung đó nữa.

 Do ảnh điểm có thể bị quay với một góc hơn lớn (khoảng 7 độ) do đó các điểm 0 và điểm 10 có độ dời theo y rất nhỏ dẫn đến ta có thể bỏ qua (không tính điểm ) các điểm đó. Để giải quết vấn đề này thì trước khi kiểm tra pixel có thuộc điểm tô hay không thì ta sẽ kiểm tra vị trí trên của pixel đen đó có còn pixel đen nào nữa không nếu có thì ta dời toạ độ y của điểm đó lên vị trí của pixel đen phía trên.

Các cách được nêu ở đây sẽ giúp cho việc nhận dạng điểm tô đen trở nên chính xác hơn.

5.4.Xây dựng giải thuật :

5.4.1. Xác định điểm tô trong một khoảng điểm : 5.4.1.1. Giải thuật : 5.4.1.1. Giải thuật :

Giải thuật xác định điểm tô đen được mô tả như sau:

Bước 1: Vòng lặp bắt đầu từ 0 đi đến hết chiều cao của khoảng điểm.

Bước 2: Vòng lặp bắt đầu từ 0 đi đến hết chiều rộng của khoảng điểm.

Bước 3: Nếu phát hiện pixel đen thì kiểm tra xem pixel đen đó có thuộc điểm tô hay không.

Nếu có thì lấy tâm của điểm đen và nhảy xuống 10 dòng quay lại bước 1

Nếu không thì quay lại bước 2 i = 0

j = 0 inum = 0

While ( i< height) Begin

While (j<width) Begin

if( pixel[i][j] =1) then

if(xacdinhdiemden( j, i, width, height, pixel, x, y)) then begin sodiem[inum].x = x sodiem[inum].y = y inum = inum + 1 i = i + 10 end j=j+1 End i=i+1 End 5.4.1.2. Lưu đồ :

Begin End i=0 inum=0 j=0 Pixels[i*width+j] =1 Đúng xacDinhDiemmoc(xcd,ycd,pixels[], width,height,xm,ym) Đúng i<height j<width Đúng Đúng Sai inum Sai soDiem[], pixels[], width,height soDiem[inum].x=xm soDiem[inum].y=ym inum+= i=i+1 i=i+12 j=j+1

5.4.2. Xác định một pixel đen có thuộc điểm tô : 5.4.2.1. Giải thuật : 5.4.2.1. Giải thuật :

Giải thuật xác định một pixel đen có thuộc điểm tô đen hay không được mô tả như sau :

Bước 1:

Kiểm tra trên pixel đen đó có còn pixel đen nào nữa hay không. Nếu có thì thì dới toạ độ y của pixel đen đó lên pixel đen phía trên.

Bước 2:

Vòng lặp để kiểm tra 12 pixel trên hàng dọc của pixel đen và vị trí kiểm tra phải nhỏ hơn chiều cao. Nếu đúng nhảy xuống bước 3, nếu không nhảy xuống bước 6.

Bước 3:

Vòng lặp để kiểm tra 12 pixel trên hàng ngang của pixel đen và vị trí kiểm tra phải nhỏ hơn chiều rộng. Nếu đúng thì nhảy xuống bước 4 nếu không thì nhảy tới bước 5.

Bước 4:

Kiểm tra pixel đen tai vị trí trên nếu là pixel đen thì thực hiện các công việc sau

 Kiểm tra nếu đã xuất hiện pixel đen trên dòng đó và hiệu số của pixel đen hiện tại với pixel đen trước đó lớn hơn 3 (nghĩa là có 3 pixel trắng liên tiếp trên dòng đó) bật cờ dừng và ngưng quét, nhảy xuống bước 5.

 Kiểm tra nếu đã xuất hiện pixel đen trên dòng đó và hiệu số của pixel đen hiện tại với pixel đen trước đó lớn hơn 4 (nghĩa là có 4 pixel trắng liên tiếp trên dòng đó) xác định đây không phải ô điểm được tô và ngừng chương trình.

 Kiểm tra nếu cờ xuất hiện điểm đen chưa bật thì bật.  Kiểm tra nếu đã xuất hiện pixel đen trên dòng đó và

hiệu số của pixel đen hiện tại với pixel đen trước đó lớn hơn 1 (nghĩa là có 1 pixel trắng giữa hai pixel đen trên dòng đó) thì

 Tăng số lần xuất hiện pixel trắng này lên 1.  Kiểm tra nếu số lần xuất hiện lớn hơn 3 thì xác

định đó không phải là điểm đã được tô và dừng chương trình.

 Kiểm tra nếu đã xuất hiện pixel đen trên dòng đó và hiệu số của pixel đen hiện tại với pixel đen trước đó lớn hơn 2 (nghĩa là có 2 pixel trắng giữa hai pixel đen trên dòng đó) thì

 Tăng số lần xuất hiện 2 pixel trắng này lên 1  Kiểm tra nếu số lần xuất hiện lớn hơn 2 thì xác

định đó không phải là điểm đã được tô và dừng chương trình.

 Tăng số chấm đen trên dòng đó lên 1.  Lưu lại vị trí chấm đen hiện tai. Quay lại bước 3.

Bước 5:

Kiểm tra nếu i=0 thì xcd-=(10-chamden)/2

Kiểm tra nếu số chấm đen trên một dòng bằng 0 và chỉ mới kiểm tra dưới 3 dòng thì xác định đây không phải là mốc và thoát khỏi chương trình.

Kiểm tra nếu số chấm đen trên một dòng bằng 0 và đã quét được 4 dòng trở lên thì ngưng quét và nhảy xuống bước 6.

Kiểm tra nếu số chấm đen trên một dòng nhỏ hơn 4 và đã quét và đang quét ở dòng ở dòng 3 hoặc 4 thì xác định đây không phải chấm đen và thoát khỏi chương trình.

Kiểm tra nếu số pixel đen trên dòng đó lớn hơn số pixel đen trên các dòng khác thì số pixel đen lớn nhất chính là số pixel đen trên dòng đó.

Tính tổng số pixel trên các dòng.

Kiểm tra cờ dừng nếu đúng thì nhảy xuống bước 6 Nhảy về bước 2.

Bước 6:

Kiểm tra nếu số pixel đen lớn nhất trên từng dòng mà nhỏ hơn 5 thì đó không phải là điểm tô và dừng chương trình.

Kiểm tra xem tổng số pixel đen có đạt đến trọng số điểm mốc hay không nếu có thì tính toạ độ tâm của mốc và trả về mốc. Nếu không thì thoát.

Toado = xcd + ycd * width K=0

While(k<10 and ( width – k – xcd) >0) Begin

If(pixels[toado+k]=1) then Begin

if(flag=0) then flag=1

if(k-bcd>1 and flag=1) then skt+=k-bcd-1

bcd=k End

K=k+1 End

dodoi=(chamden+skt)/2 // số chấm đen phía trên sdd=0

// lưu vị trí chân đen xuất hiện trước bcd=0

k=0 while(k<7) Begin

toado=xcd+dodoi+(ycd-k)*width

if(toado<0) then break if(pixels[toado]=1) then Begin sdd=sdd+k-bcd; bcd=k; End K=k+1 End Ycd = ycd - sdd Tongchamden = 0 i=0

While ( i<12 and (height-i-ycd >0) Begin toado=xcd+(ycd+i)*width chamden=0 lan = 0 lan1 = 0 bcd = 0 flag = 0 flagd = 0 skt =0

While ( j<12 and (width –j – xcd>0) Begin

If pixel[toado+j]=1 then Begin

Pixel[toado+j]=0

If j-bcd>4 and flag==1 then

Begin

Break;

End

If flag = 0 then flag=1 If j-bcd>1 and flag = 1

Begin

lan++

If lan>3 then return 0

End

If j-bcd>2 and flag=1 then

Begin

lan1++

If lan1>2 then return 0

End

chamden=chamden+1

bcd=j

End End

If chamden=0 and i<=3 then return 0 If chamden=0 and i>=4 then break

If chamden<4 and i>2 and i<5 then return 0 If max<chamden then max=chamden

Tongchamden = Tongchamden +chamden If flagd=1 break

End

If max<5 then return 0

If Tongchamden >100 and Tongchamden<196 then Begin xt=(14/2)+xcd yt=(i/2)+ycd Return 1 End Return 0

5.5.Đoạn chương trình minh hoạ :

5.5.1. Chương trình xác định điểm tô trong một khoảng điểm: Hàm có 4 tham số đưa vào sodiem, pixel, width, height Hàm có 4 tham số đưa vào sodiem, pixel, width, height

Trong đó:

SoDiem dùng để chứa tâm của của các điểm tô. Pixel là mảng cần kiểm tra điểm tô trong đó.

Width chiều rộng của của mảng pixel Height chiều cao của mảng pixel

Hàm có trả về một giá trị dụng để biết có bao nhiêu điểm tô đen trong khoảng điểm đó không.

int XacDinhDiem(diem *soDiem,byte *pixels,int width,int height){ int x,y; int inum=0; int tmp; for(int i=0;i<height;i++) for(int j=0;j<width;j++) if(pixels[long(i*width)+j]==1){ tmp=xacDinhDiemTo(j,i,width,height,pixels,x,y); if(tmp==1) { soDiem[inum].flag=tmp; soDiem[inum].x=x; soDiem[inum].y=y; inum++; i+=10; } } return inum; }

5.5.2. Chương trình xác định một pixel đen có thuộc điểm tô : Hàm có các tham số sau: xcd, ycd, width, height, pixels, xt, yt với ý Hàm có các tham số sau: xcd, ycd, width, height, pixels, xt, yt với ý nghĩa sau:

xcd, ycd : toạ độ của pixel đen trong mảng pixels.

Width, height : chiều rộng và chiều cao của mảng pixels . Pixels : mảng chứa các thông tin của khoảng ảnh.

xt, yt : tham biến dùng để chứa toạ độ tâm điểm khi tính được. Hàm trả về một giá trị cho biết là có tìm được tâm của điểm tô đen từ toạ độ của một pixel đen cho trước hay không.

int xacDinhDiemTo(int xcd,int ycd,int width,int height,unsigned char *pixels, int &xt,int &yt) {

int chamden=0; int tongchamden=0; int tongtrang=0;

int toado; int vitricd=0; int max=0; int bcd,lan,lan1;

int flag;// đã xuất hiện điểm đen int flagd;// dừng quét

// tìm số pixel đen phía trên toado=xcd+ycd*width;

for(int k=0;k<10 && (width-k-xcd)>0;k++){

if(pixels[toado+k]==1){

if(flag==0){ flag=1;

}

if(k-bcd>1 && flag==1){

skt+=k-bcd-1; } chamden++; bcd=k; } } int dodoi=(chamden+skt)/2; int sdd=0; bcd=0; for(k=1; k<7 ;k++){ toado=xcd+dodoi+(ycd-k)*width; if(toado<0) break; if(pixels[toado]==1) { sdd=sdd+k-bcd; //ycd=ycd-k+bcd; bcd=k; } } ycd-=sdd;

//đếm số chấm đen tại vị trí xcd,ycd trong khung 12 pixel for(int i=0;i<12 && (height-i-ycd)>0;i++){

toado=xcd+(ycd+i)*width; chamden=0; lan=0; lan1=0; bcd=0; flag=0;

flagd=0;

for(int j=0;j<12 && (width-j-xcd)>0;j++){

if(pixels[toado+j]==1){

////// xử lý những điểm không phải là chấm đen ///////// // loại bỏ các số 1,2,3,4,5,6,7

// 3 khoảng trắng liên tiếp xuất hiện 2 lần thì dừng if(j-bcd>3 && flag==1){

flagd=1; break;

}

// dưng khi có 5 khoảng trắng liên tiếp if(j-bcd>4 && flag==1){

return 0; } if(flag==0){ flag=1; } /// loại bỏ các số 0,8,9,10

// trong một dòng có 3 khoảng trắng đen liên tiếp thì dừng if(j-bcd>1 && flag==1){

lan++;

if(lan>3) return 0;

}

// trong một dòng có 2 khoảng trắng liên tiếp xuất hiện 2 lần thì dừng if(j-bcd>2 && flag==1){

lan1++;

if(lan1>2) return 0;

}

// đếm số chấm đen chamden++;

// lưu vị trí của chấm đen hiện tại trên một dòng bcd=j;

} }

if(i==0) xcd-=(12-chamden)/2; // kiểm tra dòng trống thì dừng

if(chamden==0 && i<=4) return 0; if(chamden==0 && i>5) break;

// kiểm tra các dòng ở giữa phải có số pixel lớn hơn 4 if(chamden<4 && i>2 && i<5) return 0;

if(max<chamden) max=chamden; tongchamden+=chamden;

if(flagd) break; }

// tính toạ độ tâm điểm tô xt=(12/2)+xcd;

yt=(i/2)+ycd; if(max<5) return 0;

if(tongchamden>35 && tongchamden<144) return 1; return 0;

}

6. Xác định điểm :

6.1.Tầm quan trọng của việc xác định điểm :

Bài toán của ta ở đây là làm sao nhập điểm tự động vào CSDL của trường do đó vấn đề của bài toán này là làm sao xác định được chính xác các điểm từ một file ảnh. Việc xác định được điểm chính xác sẽ làm cho bài toán có giá trị hiện thực để sử dụng trong thực tế.

Tất cả các vấn đề được đề ra ở trên đều phục vụ cho công việc cuối cùng là làm sao xác định được chính xác điểm.

6.2.Xác định các toạ độ có điểm :

Muốn cho việc xác định điểm có độ chính xác cao thì ta phải xác định được khoảng toạ độ của các ô điểm và khoảng toạ độ của các thí sinh. Từ đó mới có được một sự so sánh toạ độ tâm điểm tô với khoảng toạ độ trên, nếu tâm rơi vào khoảng toạ độ nào thì sẽ tương ứng với điểm và vị trí đó.

Muốn biết được khoảng toạ độ trên ta phải khảo sát trên bức ảnh tương đối chuẩn. Khi khảo sát ta phải xác định được các điều sau:

 Khoảng cách x bắt đầu của điểm 0 so với mốc.  Khoảng cách y bắt đầu của thí sinh đầu tiên.  Xác định độ rộng của các ô điểm.

 Xác định độ rộng của mỗi dòng chứa thí sinh. Sau đây là kết quả khảo sát được:

 Khoảng cách y từ mốc đến thí sinh đầu tiên là 140 pixel.  Độ rộng của các ô điểm là 16 pixel.

 Độ rộng của mổi dòng là 23 pixel.

Như vậy khoảng cách ( so với mốc ) để xác định các điểm là:  Điểm 0 : bắt đầu toạ độ 412 đến 428 (toạ độ tính bằng pixel)  Điểm 1 : từ toạ độ 428 đến 444.  Điểm 2 : từ toạ độ 444 đến 460.  Điểm 3 : từ toạ độ 460 đến 476.

Một phần của tài liệu luận văn công nghệ thông tin thiết kế hệ thống nhập điểm tự động - svth trần viết khôi (Trang 41)

Tải bản đầy đủ (PDF)

(73 trang)