Giải thuật tính góc quay:

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 29)

3. Quá trình xử lý ảnh bị biến đổi :

3.5.1.1. Giải thuật tính góc quay:

Giải thuật tính góc của ảnh được mô tả như sau:

 Từ toạ độ của điểm mốc một ta tính được toạ độ của điểm mốc 2 chuẩn bằng công thức:

Xmc2 = xmt1 + độ dời theo trục x từ mốc 1 đến mốc 2 trên ảnh chuẩn Ymc2 = ymt1 + độ dời theo trục y từ mốc 1 đến mốc 2 trên ảnh chuẩn  Từ toạ độ của mốc 2 đọc được trên bức ảnh ta tiến hành áp dụng công thức tính ma trận quay để tính khi ta có được điểm cần quay và vị trí khi đã quay đến. Công thức để tính góc quay ( sin(a), cos(a) ) được tính như sao :

Sin (a) = (dy1*dx-dx1*dy) / (dy*dy+ dx*dx) Cos(a) = ((dx1)+s*dy)/(dx) Trong đó: dy= y – yt1 dx= x - xt1 dy’=y’- yt1 dx’=y’ – xt1

( x,y) là toạ độ của điểm cần quay.

3.5.1.2. Lưu đồ giải thuật : Begin End xmt1, ymt1 xmt2, ymt2 Tính mốc hai chuẩn theo mốc 1

Tính sin và cos theo CT

Sin (a) = (dy1*dx-x1*dy) / (dy*dy+ dx*dx) Cos(a) = ((dx1)+s*dy)/(dx)

Sin(a) cos(a)

3.5.2. Tính ma trận quay :

3.5.2.1. Giải thuật tính ma trận quay : Để tính được ma trân quay cần các thông tin sau: Để tính được ma trân quay cần các thông tin sau:

 Tâm quay  Góc quay

Aùp dụng lý thuyết về quay ảnh ở phần trên ta tính ma trận quay theo công thức đó.

3.5.2.2. Lưu đồ giải thuật :

Begin

End Góc quay (c, s) tâm quay (xf, yf)

Tính ma trân quay theo công thức :

T[0][0]=c; T[0][1]=s ; T[0][2]=0; T[1][0]=-s; T[1][1]=c ; T[1][2]=0; T[2][0]=(1-c)*xf+yf*s; T[2][1]=(1-c)*yf-xf*s; T[2][2]=1;

3.5.3. Chuyển đổi toạ độ của một điểm theo ma trân quay : 3.5.3.1. Giải thuật chuyển toạ độ : 3.5.3.1. Giải thuật chuyển toạ độ :

Để chuyển một một toạ độ về vị trí mới theo ma trận quay thì ta nhân toạ độ đó với ma trận quay công thực được tính như sau:

X mới = T[0][0]* x cũ +T[1][0]* y cũ +T[2][0] Y mới = T[0][1]* x cũ +T[1][1]* y cũ +T[2][1] 3.6.Đoạn chương trình minh hoạ :

3.6.1. Tính góc quay :

Hàm này có 8 thông số đưa vào là xf, yf, x, y, x1, y1, c, s với ý nghĩa của mỗi tham số như sau :

xf, yf : toạ độ của góc quay (mốc 1)

x, y : toạ độ muốn quay (mốc 2 đọc từ ảnh) x1, y1 : toạ độ muốn (mốc 2 chuẩn theo mốc 1) Tham biến c, s : chưa giá trị của cos(a) và sin(a)

void cos_sin(int xf,int yf,int x,int y,int x1,int y1,float &c,float &s){

int dy,dx,dx1,dy1; dy=y-yf; dx=x-xf; dy1=y1-yf; dx1=x1-xf;

c=(float(dx1)+s*dy)/float(dx);

}

3.6.2. Tính ma trận quay :

Hàm tính ma trận quay có 5 tham số đưa vào là: T, c, s, xf, yf với ý nghĩa như sau:

T: là một ma trận dùng để chứa các giá trị quay. c, s :biến chứa giá trị của cos(a) và sin(a). xf, yf : toạ độ tâm quay.

void rotation(matrix T,float c,float s,int xf,int yf){

T[0][0]=c; T[0][1]=s ; T[0][2]=0; T[1][0]=-s; T[1][1]=c ; T[1][2]=0; T[2][0]=(1-c)*xf+yf*s; T[2][1]=(1-c)*yf-xf*s; T[2][2]=1; }

3.6.3. Chuyển toạ độ theo ma trận quay :

Hàm chuyển toạ độ theo ma trận có 3 tham số đưa vào là x, y, T với ý nghĩa như sau:

x, y :tham biến chứa toạ độ cần biến đổi và sau khi biến đổi T: ma trận quay.

void transform(int &x,int &y,matrix T){

float tmp;

tmp=T[0][0]*x+T[1][0]*y+T[2][0]; y=T[0][1]*x+T[1][1]*y+T[2][1]; x=tmp;

4. Xác định mốc :

4.1.Tại sao phải sử dụng mốc :

Nguyên nhân 1: Do ảnh Scan là một ảnh thủ công nó tuỳ thuộc vào người nhập điểm và ảnh Scan. Do đó ảnh Scan không ảnh nào là giống ảnh nào về kích thước và vị trí của ảnh dẫn đến ta không thể nào xác định được điểm chính xác của bảng điểm nhập vào. Để tính được điểm chính xác ta phải có được một toạ độ để các điểm khác lấy toạ độ đó làm chuẩn để xác định được nó đang ở đâu so với toạ độ đó. Toạ độ được nói đến được gọi là mốc để các toạ độ khác tham chiếu đến nghĩa là toạ độ các điểm sẽ được tính dựa vào toạ độ mốc. Đối với bài này thì mốc đó được gọi là mốc 1 (nằm ở góc trái trên).

Nguyên nhân 2: Do người nhập điểm đặt bảng điểm không thẳng dẫn đến ảnh điểm sẽ bị quay hoặc tịnh tiến do đó các toạ độ điểm tô không còn thẳng hàng so với toạ độ mốc 1 cho nên khi ta tính điểm và vị trí sẽ không còn chính xác nữa. Điều này dẫn đến việc ta phải có thêm một mốc nữa để xác định được góc quay của ảnh từ đó tất cả các điểm sẽ được quay về vị trí chuẩn so với vị trí mốc 1. Mốc được nói ở trên ta gọi là mốc 2 (nằm ở vị trí góc phải dưới của ảnh).

Nguyên nhân 3: Do có rất nhiều loại máy Scan mà mỗi máy Scan sẽ cho những khoảng màu hoàn toàn khác nhau nên không thể biết được chính xác khoảng màu của các điểm tô đó. Do đó khi ta dựa vào khoảng màu của mốc 1 ta sẽ suy ra được khoảng màu của các điểm tô.

Ba nguyên nhân trên cho ta thấy tầm quan trọng của việc xác định mốc để giải quyết bài toán này. Đó là ba lý do chính cho ta thấy được vấn đề tại sao phải xác định mốc.

4.2.Xác định các khoảng ảnh có thể xác định được mốc :

Do bảng điểm có kích thước rất lớn, có rất nhiều phần ảnh nếu ta kiểm tra tất cả các phần ảnh để tìm ra mốc thì chương trình của ta sẽ phải đọc ảnh rất nhiều để tìm được mốc dẫn đến chương trình có thể sẽ thực thi rất chậm và không ổn định. Mà trên thực tế thì chỉ có một khoảng điểm là có khả năng có mốc. Đó là lý do ta phải xác định khoảng điểm có mốc.

Vấn đề của chương này đề ra là làm sao xác định được tương đối chính xác tâm của điểm mốc. Muốn xác định tương đối chính xác tâm của điểm mốc ta phải biết được khoảng điểm mà có mốc, và phải xác định khoảng điểm đó nằm ở đâu trên bức ảnh. Như ta đã biết, bảng điểm có hai mốc nằm ở vị trí trái trên và phải dưới của bảng điểm nhưng khi Scan cho ra ảnh điểm thì do ảnh có thể bị tịnh tiến, quay nên điểm mốc cũng không nằm tại một vị trí cố định mà sẽ nằm ở vị trí tuỳ thuộc vào ảnh bị quay bao nhiêu và

tịnh tiến bao nhiêu. Vấn đề ở đây là ta phải tìm ra được những vị trí nào mà mốc xuất hiện khi ảnh quay và tịnh tiến trong khả năng bài toán cho phép.

Để giải quyết vấn đề trên ta phải qua thực nghiệm đối với mọi khả năng có thể xảy ra đối với bài toán để tìm ra được khoảng ảnh để xác định được mốc. Qua thực nghiệm tính được khoảng điểm có khả năng xác định được mốc 1 nằm trong khoảng (0,0) đến (200,200) và khoảng ảnh có khả năng xác định được mốc 2 nằm trong khoảng ( w-100 , ymt1+743 ) đến ( w , ymt1+843 ) với w là chiều rộng của ảnh và ymt1 toạ độ y của mốc 1.

4.3.Giải pháp để xác định tâm của một mốc :

Giải pháp để xác định tâm của một mốc được mô tả như sau:

Tìm tuần tự trên phần ảnh có mốc, nếu phát hiện ra điểm đen thì dừng lại và kiểm tra xem điểm đen đó có thuộc mốc hay không nếu có thì xác định tâm của mốc và ngưng việc tìm mốc, nếu không phải là mốc thì tiếp tục tìm điểm đen trên phần ảnh đó.

Có hai phương pháp để thực hiện việc kiểm tra một điểm đen có thuộc mốc hay không được mô tả như sau:

Giải pháp 1: Phương pháp quét hình chữ thập

Khi ta phát hiện ra một pixel đen, từ pixel đen đó ta quét ngang tìm xem trên dòng pixel đen đó có bao nhiêu pixel đen, sau đó ta lấy pixel đen ở giữa các pixel đen trên hàng đó, sau đó ta tiến hành quét theo cột tại vị trí của pixel đen giữa đó để tìm xem trên cột đó có bao nhiêu pixel đen. Nếu số pixel đen trên cột đó nằm trong khoảng từ 12 đến 14 pixel thì ta mới tiếp tục công việc kiểm tra, sau đó lấy điểm giữa của các pixel trên trên cột đó và tiếp tục quét ngang qua hai bên để tìm số pixel đen ở hai bên. Nếu số pixel đen ngang đạt được từ 12 dến 14 pixel thì dừng và khẳng định pixel đen ở trên là pixel thuộc mốc, từ đó suy ra tâm của điểm đen là điểm giữa của dòng và cột.

Giải pháp này có một ưu điểm là số lần kiểm tra một pixel đen có thuộc mốc rất ít dó đó chương trình sẽ kiểm tra rất nhanh, nhưng nó có một khuyết điểm là rất dễ dẫn đến sai lầm trong việc nhận dạng mốc do trong ảnh điểm có rất nhiều thứ thoả mãn với cách quét hình chữ thập.

Giải pháp 2: Phương pháp quét đóng khung

Khi ta phát hiện ra điểm đen, thì từ pixel đen đó ta sẽ quét theo hàng ngang 14 pixel tìm xem trên dòng pixel đen đó có bao nhiêu pixel đen, sau đó ta dùng một công thức sau để tính biên đặt khung quét:

xcd = xcd – (14 – so pixel đen trên dòng đó)/2

Sau khi biết được biên để đặt khung ( khung có chiều rộng 14 pixel và chiều ngang 14 pixel ) ta tiến hành quét trong khung lần lượt từ trên xuống

để tìm tổng số điểm đen, sau khi quét hết khung ta tiến hành kiểm tra tổng số pixel trong khung đó. Nếu tổng số pixel đen trong khung đạt được từ 100 đến 196 pixel đen thì ta xác định pixel đen đó là pixel đen của mốc. Sau đó ta tiến hành xác định tâm của mốc và ngưng việc kiểm tra. Nếu không phải là pixel đen của mốc thì ta tiến hành quét và để tìm số pixel để kiểm tra.

Giải pháp này có một ưu điểm là nó xác định pixel đen thuộc mốc rất chính xác và ít khi bị lầm lẫn trong việc nhận dạng, nhưng cũng có khiếm khuyết là phải kiểm tra quá nhiều điểm mới xác nhận được một pixel đen có thuộc mốc hay không. Ta cũng có thể khắc phục được phần nào giải pháp này bằng cách tạo thêm một số điều kiện để loại trừ những pixel đen không thuộc mốc.

Kết luận:

Trong hai giải pháp trên ta nhận thấy giải pháp một rất phức tạp mà độ chính xác không cao do nó rất dễ kiểm tra nhầm lẫn mốc. Mà chương trình của ta đòi hỏi việc xác định mốc phải chính xác. Còn giải pháp thứ hai thì tương đối chính xác hơn nhưng chương trình sẽ phải quét nhiều hơn. Do những ưu khuyết điểm của hai giải pháp trên ta thấy việc chọn giải pháp 1 là không khả thi vì độ chính xác của giải pháp này không cao. Vì vậy ta sẽ chọn giải pháp 2 để giải quyết vấn đề nhận dạng mốc của bài toán này.

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

Từ ưu điểm và khuyết điểm của hai giải pháp trên ta đi đến quyết định chọn giải pháp 2 để xây dựng giải thuật xác định mốc. Giải thuật chia làm hai phần: phần đầu xác định mốc trong một khoảng điểm và phần hai xác định một pixel đen có thuộc một mốc hay không. Giải thuật được mô tả như sau:

4.4.1. Xác định mốc có trong một khoảng điểm : 4.4.1.1. Giải thuật : 4.4.1.1. Giải thuật :

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

Bước 1: Đi theo chiều từ trên xuống của khoảng điểm. Bước 2: Đi theo chiều từ trái qua phải 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 mốc hay không.

Nếu có thì lấy tâm của mốc và thoát Nếu không thì quay lại bước 1, bước 2 i= 0

While ( i< height) Begin

While (j<width) Begin

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

if(xacdinhdiemmoc( j, i, width, height, pixel, x, y)) then begin xm = x ym = y exit end j=j+1 End i=i+1 End

4.4.1.2. Lưu đồ : Begin Begin End i=0 j=0 Pixels[i*width+j] =1 Đúng xacDinhDiemmoc Đúng i<height j<width Đúng Đúng j=j+1 Sai i=i+1 Xm Ym Trả về 1 Trả về 0 Sai soDiem, pixels, width,height

4.4.2. Xác định một pixel đen có thuộc một mốc : 4.4.2.1. Giải thuật : 4.4.2.1. Giải thuật :

Giải thuật xác định một pixel đen thuộc mốc được mô tả như sau : Bước 1: Vòng lặp để kiểm tra 14 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 2, nếu không nhảy xuống bước 5.

Bước 2: Vòng lặp để kiểm tra 14 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 3 nếu không thì nhảy tới bước 4.

Bước 3: Kiểm tra pixel đen tai vị trí trên nếu là pixel đen thì tăng số pixel đen tìm được lên một.

Bước 4: Kiểm tra nếu i=0 thì xcd-=(14-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 5.

Tính tổng số pixel trên và nhảy về bước 1.

Bước 5: 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.

Tongchamden = 0 i=0

While ( i<14 and (height-i-ycd >0) Begin

toado=xcd+(ycd+i)*width chamden=0

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

If pixel[toado+j]=1 then chamden=chamden+1 End

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

Tongchamden = Tongchamden +chamden End

If Tongchamden >100 and Tongchamden<196 then Begin

xt=(14/2)+xcd yt=(i/2)+ycd Return 1

End Return 0

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

4.5.1. Chương trình xác định mốc 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 mốc. Pixel là mảng cần kiểm tra mốc trong đó. Width chiều rộng của của mảng pixel Height chiều cao của mảng pixel

Hàm trả về một giá trị để biết có mốc trong khoảng điểm đó không. int XacDinhMoc(diem *soDiem,byte *pixels,int width,int height){

int x,y; int tmp;

for(int i=0;i<height;i++) for(int j=0;j<width;j++)

// kiểm tra số pixel tai vị trí i và j if(pixels[long(i*width)+j]==1){ tmp=xacDinhDiemMoc(j,i,width,height,pixels,x,y); if(tmp==1) { soDiem[0].flag=tmp; soDiem[0].x=x; soDiem[0].y=y; return 1; } } return 0; }

4.5.2. Chương trình xác định một pixel có thuộc một mốc : 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 mốc từ toạ độ của một pixel đen cho trước hay không.

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

int chamden=0; int tongchamden=0; int toado;

//đếm số pixel đen tại vị trí xcd,ycd trong một khung cho trước for(int i=0;i<14 && (height-i-ycd)>0;i++){

// biến toạ độ x,y ra toạ độ vật lý của mảng toado=xcd+(ycd+i)*width;

chamden=0;

// đếm số pixel đen trong một dòng

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

if(pixels[toado+j]==1) chamden++;

}

// xác định lại biên trái của khung if(i==0) xcd-=(14-chamden)/2;

// các điều kiện khi số chấm đen trên một dòng bằng không if(chamden==0 && i<=3) return 0;

if(chamden==0 && i>=4) break; // tính tông của pixel đen trong một khung

tongchamden+=chamden; }

// xác định tâm của của điểm tô xt=(14/2)+xcd;

yt=(i/2)+ycd;

// xác định tổng số chấm đen trong khung có phải là trọng số của mốc không

if(tongchamden >100 && tongchamden <196) return 1; return 0;

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

5.1.Tại sao phải xác định điểm tô đen :

Như đã mô tả ở phần trên thay vì ta nhận dạng điểm bằng chữ viết tay, ta thay vào đó ta nhận dạng điểm bằng các ô được tô đen. Tại vì khi nhận dạng được các ô được tô đen ta sẽ biết được toạ độ tâm của các ô tô đen đó, từ toạ độ của tâm điểm tô ta có thể xác định được điểm và vị trí tương ứng với bảng điểm.

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

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 29)

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

(73 trang)