Ngựa vằn

  • Houses logical puzzle: who owns the zebra and who drinks water?

1) Five colored houses in a row, each with an owner, a pet, cigarettes, and a drink.
2) The English lives in the red house.
3) The Spanish has a dog.
4) They drink coffee in the green house.
5) The Ukrainian drinks tea.
6) The green house is next to the white house.
7) The Winston smoker has a serpent.
8) In the yellow house they smoke Kool.
9) In the middle house they drink milk.
10) The Norwegian lives in the first house from the left.
11) The Chesterfield smoker lives near the man with the fox.
12) In the house near the house with the horse they smoke Kool.
13) The Lucky Strike smoker drinks juice.
14) The Japanese smokes Kent.
15) The Norwegian lives near the blue house.

Who owns the zebra and who drinks water?

 


%trace
domains

s=symbol
i=integer
listi=i*
lists=s*

predicates

cungcot(s,lists,s,lists)
sinhds(i,lists)
xuat(lists)
phai(s,lists,s,lists)
canh(s,lists,s,lists)

nha

clauses

cungcot(X,[X|_],Y,[Y|_]).
cungcot(X,[_|DuoiX],Y,[_|DuoiY]):-cungcot(X,DuoiX,Y,DuoiY).

sinhds(0,[]):-!.
sinhds(N,[_|Duoi]):-N1=N-1,sinhds(N1,Duoi).

xuat([]).
xuat([D|Duoi]):-free(D),!,writef("%15s","_"),xuat(Duoi).
xuat([D|Duoi]):-writef("%15s",D),xuat(Duoi).

phai(X,[X|_],Y,[_,Y|_]):-!.
phai(X,[_|DuoiX],Y,[_|DuoiY]):-phai(X,DuoiX,Y,DuoiY).

canh(X,LX,Y,LY):-phai(X,LX,Y,LY);phai(Y,LY,X,LX).

nha:-Nha=["1","2","3","4","5"],
sinhds(5,QT),sinhds(5,Mau),sinhds(5,Vat),
sinhds(5,Uong),sinhds(5,Hut),cungcot(anh,QT,do,Mau),
cungcot(oldgold,Hut,sen,Vat),
cungcot(tbnha,QT,cho,Vat),
cungcot(cafe,Uong,xlcay,Mau),
cungcot(ukrain,QT,tra,Uong),
cungcot(kool,Hut,vang,Mau),
cungcot(gitanes,Hut,ruou,Uong),
cungcot(nhat,QT,caraven,Hut),
cungcot(anh,QT,do,Mau),
cungcot(tbnha,QT,cho,Vat),
cungcot(sua,Uong,"3",Nha),
cungcot(nauy,QT,"1",Nha),
phai(trang,Mau,xlcay,Mau),
canh(fied,Hut,cao,Vat),
canh(kool,Hut,ngua,Vat),
canh(nauy,QT,xdtroi,Mau),nl,
cungcot(_,QT,"NUOC",Uong),
cungcot(_,QT,"NGUAVAN",Vat),
xuat(QT),nl,xuat(Mau),nl,
xuat(Vat),nl,xuat(Uong),nl,xuat(Hut),nl.

goal
nha,nl,readchar(_).

Advertisements

Bài Tập Các Phép Toán Trên Tập Hợp ProLog

  • Xây dựng các phép toán trên tập hợp Hội ,Giao,Hiệu Thuộc,Bao Hàm.

domains

i=integer
list=i*

predicates

nhap(list)
xuat(list)
giao(list,list,list)
thuoc(i,list)
hop(list,list,list)
noi(i,list,list)
loaitrung(list,list)
hieu(list,list,list)
baoham(list,list)
clauses

nhap([X|T]):-readint(X),X>=0,!,nhap(T).
nhap([]).

xuat([]).
xuat([X|T]):-write(X),write(" "),xuat(T).

thuoc(X,[X|_]).
thuoc(X,[_|T]):-thuoc(X,T).

giao([],_,[]).
giao([H1|T1],L2,[H1|Result]):-thuoc(H1,L2),!,giao(T1,L2,Result).
giao([_|T1],L2,Result):-giao(T1,L2,Result).

noi(X,[],[X]).
noi(X,[H|T],[H|Result]):-noi(X,T,Result).

hop([],L2,L2).
hop([H1|T1],L2,Result):-noi(H1,L2,L2KQ),hop(T1,L2KQ,Result).

loaitrung([],[]).
loaitrung([H|T],Result):-thuoc(H,T),!,loaitrung(T,Result).
loaitrung([H|T],[H|Result]):-loaitrung(T,Result).

hieu([],_,[]).
hieu([H|T],L2,[H|Result]):-not(thuoc(H,L2)),!,hieu(T,L2,Result).
hieu([_|T],L2,Result):-hieu(T,L2,Result).

baoham(_,[]).
baoham(L,[H|T]):-thuoc(H,L),!,baoham(L,T).
goal

clearwindow,
write("Nhap vao Tap A : "),nl,nhap(A),loaitrung(A,A1),nl,
write("Xuat Tap A :"),nl,xuat(A1),nl,

write("Nhap vao Tap B : "),nl,nhap(B),loaitrung(B,B1),nl,
write("Xuat Tap B :"),nl,xuat(B),nl,

write("A giao B :"),nl,giao(A1,B1,G),xuat(G),nl,
write("A hop B :"),nl,hop(A1,B1,H),loaitrung(H,H1),xuat(H1),nl,

write("A hieu B :"),nl,hieu(A1,B1,N),nl,xuat(N).

Diễn đạt bằng lời :

Với vị từ nhap(L) ta tiến hành nhập phần tử và gán vào danh sách ,nếu phần tử nhập vào X>=0 thì vẫn gọi vị từ nhập để nhập danh sách còn ngược lại thì gặp nhát cắt và dừng việc nhập lại đi xuống dòng tiếp theo và trả về danh sách rỗng sau đó đệ quy ngược lại để gom các phần tử trước đó đã cho vào danh sách . 

Với vị từ xuat(L) Duyệt danh sách và xuất phần tử cho đến khi nào danh sách rỗng thì dừng.

Với vị từ thuoc(X,L) Nếu phần tử đầu của danh sách trùng với X thì trả về kết quả đúng còn ngược lại khi duyệt hết danh sách mà không có phần tử X nào trong danh sách L thì trả về kết quả sai.

Vị từ noi(X,L,R) duyệt qua danh sách L gán các phần tử của L cho R cho đến khi danh sách L là rỗng thì gán X vào danh sách R.

Vị từ hop(L1,L2,R) nối từng phần tử của danh sách L1 vào L2 được danh sách R

 

 

Tổng hợp bài tập lập trình Prolog (TT)

  • Kiểm tra số tự nhiên N có phải là số nguyên tố hay không ? Tìm N số nguyên tố đầu tiên.

Số nguyên tốsố tự nhiên chỉ có hai ước số dương phân biệt là 1 và chính nó. 

Viết vị từ kiểm tra một số tự nhiên có phải là số nguyên tố hay không


kiemtranguyento(N,I):-N>1,N=I.
kiemtranguyento(N,I):-N>1,Du=N mod I , Du <> 0,I1=I+1,kiemtranguyento(N,I1).

Ví dụ gọi vị từ kiemtranguyento(5,2) thì kết quả trả về là Yes.

Diễn đạt bằng lời :

N là số ta muốn kiểm tra có phải nguyên tố hay không.

I là giá trị chạy từ I đến  N , nhiệm vụ để kiểm tra xem trong khoảng từ I cho đến N thì N có chia hết cho số nào trong khoảng đó hay không ,nếu chia hết mà lúc này I=N tức là trong khoảng từ I đến N-1 không có bất kỳ số nào mà N chia hết thì đó là số nguyên tố ,còn ngược lại trong khoảng đó N có chia hết cho số nào đó thì N không phải nguyên tố.


Viết vị từ songuyentonhohonnsapgiam để liệt kê các số nguyên tố mà nhỏ hơn hoặc bằng N sắp theo chiều giảm dần.


songuyentonhohonnsapgiam(2,[2]):-!.
songuyentonhohonnsapgiam(N,[N|Kq]):-kiemtranguyento(N,2),!,N1=N-1,songuyentonhohonnsapgiam(N1,Kq).
songuyentonhohonnsapgiam(N,Kq):-N1=N-1,songuyentonhohonnsapgiam(N1,Kq).

Ví dụ : Gọi vị từ  songuyentonhohonnsapgiam(5,Kq) thì kết quả trả về là Kq=[5,3,2].

Diễn đạt bằng lời :

Ban đầu kiểm tra xem N truyền vào có bằng 2 hay không nếu bằng 2 thì trả về kết quả là 2 (Dòng 1)

Nếu đi kiểm tra N là số nguyên tố thì trong kết quả sẽ có N và đi tìm tiếp N-1 có phải là số nguyên tố hay không (Dòng 2)

Nếu N không phải là số nguyên tố thì trong kết quả sẽ không có N và đi tìm tiếp N-1 có phải là nguyên tố hay không (Dòng 3)

Đi tìm cho đến khi nào N=2 thì dừng và trả về kết quả mảng các số nguyên tố.


Viết vị từ songuyentonhohonnsaptang để liệt kê các số nguyên tố mà nhỏ hơn hoặc bằng N sắp theo chiều tăng dần.


songuyentonhohonnsaptang(X,N,[]):-X>N,!.
songuyentonhohonnsaptang(X,N,[X|Kq]):-kiemtranguyento(X,2),!,X1=X+1,songuyentonhohonnsaptang(X1,N,Kq).
songuyentonhohonnsaptang(X,N,Kq):-X1=X+1,songuyentonhohonnsaptang(X1,N,Kq).

Ví dụ : Gọi vị từ songuyentonhohonnsaptang (2,5,Kq) thì kết quả trả về là Kq=[2,3,5].

Diễn đạt bằng lời :

là số tăng từ 2 cho đến N  . X<=N

Kiểm tra xem X có phải là nguyên tố hay không nếu X là nguyên tố thì trong kết quả có X và đi kiểm tra X+1 có phải là nguyên tố hay không.(Dòng 2)

Nếu X không phải là nguyên tố thì vẫn đi tìm X+1 có phải là nguyên tố hay không (Dòng 3)

Tìm cho đến khi X>N thì dừng lại và trả về kết quả .(Dòng 1).

Còn có cách  khác như sau :


songuyentonhohonnsaptang2(1,Phu,Phu):-!.
songuyentonhohonnsaptang2(X,Phu,Kq):-kiemtranguyento(X,2),!,X1=X-1,PhuMoi=[X|Phu],songuyentonhohonnsaptang 2(X1,PhuMoi,Kq).
songuyentonhohonnsaptang2(X,Phu,Kq):-X1=X-1,songuyentonhohonnsaptang 2(X1,Phu,Kq).


  • Đão ngược trật tự mọi phần tử của một danh sách

daonguocdanhsach(DS,Kq):-daonguocdanhsachx(DS,[],Kq).

daonguocdanhsachx([],Phu,Phu).
daonguocdanhsachx([Dau|Duoi],Phu,Kq):-PhuMoi=[Dau|Phu],daonguocdanhsachx(Duoi,PhuMoi,Kq).

Ví dụ : Gọi vị từ  daonguocdanhsach([1,2,3,4,5],Kq) thì kết quả trả về là Kq=[5,4,3,2,1].

Hoặc có thể gọi vị từ daonguocdanhsachx([1,2,3,4,5],[],Kq) thì kết quả trả về là Kq=[5,4,3,2,1].

Diễn đạt bằng lời :

Khi gọi vị từ daonguocdanhsachx thì Phụ ban đầu là rỗng sau đó gán phần tử đầu vào vị trí đầu tiên của Phụ được Phụ Mới ,duyệt như vậy cho đến khi danh sách rỗng thì Kq bằng danh sách Phụ đã tìm được trước đó .(Dòng 2, Dòng 3)

Khi gọi vị từ daonguocdanhsach thì nó sẽ gọi đến daonguocdanhsachx với Phu là rỗng rồi duyệt danh sách như giải thích bên trên.  


  • Xây dựng vị từ thuộc trong đó có thêm một đối số để trả vệ trị TRUE nếu phần tử x thuộc danh sách l cho trước và FALSE trong trường hợp ngược lại .

thuoc(_,[],"FALSE").
thuoc(X,[X|_],"TRUE"):-!.
thuoc(X,[_|Duoi],Kq):-thuoc(X,Duoi,Kq).

Ví du gọi vị từ thuoc(2,[1,2,3,4],Kq) thì Kq=TRUE

Hoặc thuoc(5,[1,2,3,4],Kq) thì kq=FALSE

Diễn đạt bằng lời :

Nếu phần tử X xuât hiện tại vị trí nào đó trong danh sách thì Kq=”TRUE” còn ngược lại thì duyệt danh sách về Đuôi (Dòng 1 , Dòng 2) nếu duyệt đến khi danh sách đã rỗng thì Kq=”FALSE” (Dòng 1)


  • Xây dựng quy tắc NằmNgoài(x,L) để kiểm tra xem x không thuộc danh sách L 

namngoai(_,[]).
namngoai(X,[X|_]):-!,fail.
namngoai(X,[_|Duoi]):-namngoai(X,Duoi).

Ví du gọi vị từ namngoai(2,[1,2,3]) thì kết quả là No

Hoặc gọi vị từ namtrong(5,[1,2,3]) thì thì kết quả là Yes

Diễn đạt bằng lời :

Nếu duyệt danh sách phần tử đầu của danh sách không trùng với X thì duyệt về phần đuôi của danh sách cho đến khi danh sách rỗng thì trả về  Yes (Dòng 1 ,Dòng 3)

Nếu trong khi duyệt danh sách có phần tử trùng với X thì sử dụng nhát cắt để dừng việc tìm kiếm và đồng thời trả về fail ,kết quả là No. (Dòng 2).


  • Xây dựng quy tắc khacnhau(L) để kiểm tra danh sách L không có phần tử trùng nhau

khacnhau([]).
khacnhau([Dau|Duoi]):-namngoai(Dau,Duoi),!,khacnhau(Duoi).

Ví du gọi vị từ khacnhau([1,2,2,3]) thì kết quả là No

khacnhau([1,2,3]) thì kết quả là Yes

Diễn đạt bằng lời :

Nếu phần tử đầu  nằm ngoài danh sách đuôi (tức là không có phần tử nào thuộc danh sách đuôi ) thì tiếp tục đi về đuôi để kiểm tra .

Nếu như phần tử đầu trùng với phần tử nào đó trong đuôi gặp nhát cắt dừng chương trình và trả kết quả về sai (No) (Dòng 2)

Nếu duyệt hết danh sách mà tất cả đều thỏa thì trả về kết quả đúng (True) (Dòng 1)


  • Xây dựng quy tắc phandau(l1,l2) để kiểm tra danh sách l1 là phần đầu của danh sách l2

phandau([],_).
phandau([Dau1|Duoi1],[Dau2|Duoi2]):-Dau1=Dau2,phandau(Duoi1,Duoi2).

Ví du gọi vị từ khacnhau([1,2,2],[1,2,2,3]) thì kết quả là Yes

khacnhau([1,2,4],[1,2,3,4]) thì kết quả là No

Diễn đạt bằng lời :

Duyệt 2 danh sách nếu phần tử đầu của danh sách 1 trùng với phần tử đầu của danh sách 2 thì duyệt tiếp phần đuôi của danh sách 1 và đuôi của danh sách 2 ,ngược lại thì dừng và trả về kết quả sai.(Dòng 2)

Nếu duyệt hết danh sách 1 thì kết quả trả về đúng (Các phần tử trong danh sách 1 đều thỏa điều kiện ) (Dong 1).


  • Xây dựng quy tắc namtronglientiep(l1,l2) để kiểm tra mọi phần tử của l1 đều nằm liên tiếp trong danh sách l2

namtronglientiep([],_).
namtronglientiep([Dau1|Duoi1],[Dau2|Duoi2]):-Dau1=Dau2,!,namtronglientiep(Duoi1,Duoi2).
namtronglientiep([Dau1|Duoi1],[_|Duoi2]):-namtronglientiep([Dau1|Duoi1],Duoi2).

Ví du gọi vị từ namtronglientiep([1,2,3],[5,6,7,1,2,3]) thì kết quả là Yes

namtronglientiep([1,2,4],[1,2,3,4]) thì kết quả là No

Diễn đạt bằng lời :

Nếu phần tử đầu của danh sách 1 bằng phần tử đầu của danh sách 2 thì duyệt về phần đuôi của danh sách 1 và danh sách 2 ,ngược lại nhảu xuống Dòng 3 (Dòng 2)

Xét phần tử đầu của danh sách 1 có nằm trong phần đuôi của danh sách 2 hay không (Dòng 3)

Nếu đã duyệt hết danh sách thứ 1 mà mọi điều kiện thỏa thì trả về kết quả đúng ( Dòng 1).


  • Xây dựng quy tăc phân hoạch(L,U,V,W) để phân hoạch danh sách L thành 3 danh sách U,V,W .

phanhoach([],[],[],[]).
phanhoach([Dau|Duoi],U,[Dau|V],W):-Dau=10,!,phanhoach(Duoi,U,V,W).
phanhoach([Dau|Duoi],[Dau|U],V,W):-Dau<=10,!,phanhoach(Duoi,U,V,W).
phanhoach([Dau|Duoi],U,V,[Dau|W]):-phanhoach(Duoi,U,V,W).

Ví dụ : gọi vị từ phanhoach([1,2,3,4,5,6,7,8,9,10,11,12,13,10],U,V,W) thì kết quả là U=[1,2,3,4,5,6,7,8,9] , V=[10,10] , W=[11,12,13] .

Diễn đạt bằng lời :

Nếu phần tử đầu của danh sách Dau =10 thì nó được cho vào danh sach V  và duyệt tiếp phần đuôi của danh sách L nếu điều kiện không thỏa thì sử dụng nhát cắt dừng việc tìm kiếm kết quả đi xuống dòng tiếp theo (Dòng 2)

Nếu phần tử đầu của danh sách Dau <=10 thì nó được cho vào danh sach U và duyệt tiếp phần đuôi của danh sách L nếu điều kiện không thỏa thì sử dụng nhát cắt dừng việc tìm kiếm kết quả đi xuống dòng tiếp theo (Dòng 3)

Nếu đã đi qua các điệu kiện trên Dau =10 và Dau <=10 mà không thỏa thì phần đầu lúc này sẽ Dau > 10 và cho vào danh sách V (Dòng 4).

Nếu duyệt hết danh sách thì các danh sách U , V ,W là rỗng sau đó quay lui trở lại để lấy kết quả của mỗi danh sách mà lúc đầu nếu thỏa điều kiện đã gán vào danh sách đo (Dòng 1)


  • Xuất ra mọi hoán vị của những phần tử của danh sách cho trước

noi([],L2,L2).
noi([X|Duoi1],L2,[X|Kq]):-noi(Duoi1,L2,Kq).

hoanvi([],[]).
hoanvi([Dau|Duoi],Kq):-hoanvi(Duoi,KqDuoi),noi(L1,L2,KqDuoi),noi(L1,[Dau],Tam),noi(Tam,L2,Kq).

Hàm bổ trợ để tạo ra đường dẫn thân thiện (Url Friendly)

Đây là các hàm bổ trợ để tạo đường dẫn thân thiện cho website các bạn có thể tham khảo ở đây :

Ví dụ chúng ta có 1 chuỗi như sau : 

Điện thoại Samsung Galaxy J7 Prime

sau khi chuyển đổi thì chuỗi ban đầu sẽ trở thành :

dien-thoai-samsung-galaxy-j7-prime


//Hàm bổ trợ cho việc tạo Url thân thiện
function makeUrl($string)
{
  //Loại bỏ dấu của chữ
  $string=strU($string);
  //Cắt khoảng trắng ở đầu và cuối chuỗi
  $string=trim($string);
  //Thay thế khoảng trắng giữa các từ bằng dấu gạch ngang
  $string=str_replace(" ","-",$string);
  //Chuyển chuỗi về dạng chữ in thường
  $string=strtolower($string);
  //Trả về kết quả sau khi biến đổi
  return $string;
}
//Hàm loại bỏ dấu của chữ
function strU($str)
{
  $str = preg_replace("/(à|á|ạ|ả|ã|â|ầ|ấ|ậ|ẩ|ẫ|ă|ằ|ắ|ặ|ẳ|ẵ)/", 'a', $str);
  $str = preg_replace("/(è|é|ẹ|ẻ|ẽ|ê|ề|ế|ệ|ể|ễ)/", 'e', $str);
  $str = preg_replace("/(ì|í|ị|ỉ|ĩ)/", 'i', $str);
  $str = preg_replace("/(ò|ó|ọ|ỏ|õ|ô|ồ|ố|ộ|ổ|ỗ|ơ|ờ|ớ|ợ|ở|ỡ)/", 'o', $str);
  $str = preg_replace("/(ù|ú|ụ|ủ|ũ|ư|ừ|ứ|ự|ử|ữ)/", 'u', $str);
  $str = preg_replace("/(ỳ|ý|ỵ|ỷ|ỹ)/", 'y', $str);
  $str = preg_replace("/(đ)/", 'd', $str);
  $str = preg_replace("/(À|Á|Ạ|Ả|Ã|Â|Ầ|Ấ|Ậ|Ẩ|Ẫ|Ă|Ằ|Ắ|Ặ|Ẳ|Ẵ)/", 'A', $str);
  $str = preg_replace("/(È|É|Ẹ|Ẻ|Ẽ|Ê|Ề|Ế|Ệ|Ể|Ễ)/", 'E', $str);
  $str = preg_replace("/(Ì|Í|Ị|Ỉ|Ĩ)/", 'I', $str);
  $str = preg_replace("/(Ò|Ó|Ọ|Ỏ|Õ|Ô|Ồ|Ố|Ộ|Ổ|Ỗ|Ơ|Ờ|Ớ|Ợ|Ở|Ỡ)/", 'O', $str);
  $str = preg_replace("/(Ù|Ú|Ụ|Ủ|Ũ|Ư|Ừ|Ứ|Ự|Ử|Ữ)/", 'U', $str);
  $str = preg_replace("/(Ỳ|Ý|Ỵ|Ỷ|Ỹ)/", 'Y', $str);
  $str = preg_replace("/(Đ)/", 'D', $str);
  $str = preg_replace("/[^A-Za-z0-9 ]/", '', $str);
  $str = preg_replace("/\s+/", ' ', $str);
  $str = trim($str);
  return $str;
}

Cài đặt OpenCV cho Android Studio

  • Giới thiệu

OpenCV là một thư viện mã nguồn mở hàng đầu cho thị giác máy tính (computer vision), xử lý ảnh và máy học, và các tính năng tăng tốc GPU trong hoạt động thời gian thực.

OpenCV được phát hành theo giấy phép BSD, do đó nó hoàn toàn miễn phí cho cả học thuật và thương mại. Nó có các interface C++, C, Python, Java và hỗ trợ Windows, Linux, Mac OS, iOS và Android. OpenCV được thiết kế để tính toán hiệu quả và với sự tập trung nhiều vào các ứng dụng thời gian thực. Được viết bằng tối ưu hóa C/C++, thư viện có thể tận dụng lợi thế của xử lý đa lõi. Được sử dụng trên khắp thế giới, OpenCV có cộng đồng hơn 47 nghìn người dùng và số lượng download vượt quá 6 triệu lần. Phạm vi sử dụng từ nghệ thuật tương tác, cho đến lĩnh vực khai thác mỏ, bản đồ trên web hoặc công nghệ robot. (nguồn Google.com)

  • Cách cài đặt 

Bước 1 : Tải OpenCV cho Android Studio

Vào trang http://opencv.org/releases.html để tải OpenCV tải phiên bản mới nhất tình từ thời điểm này là phiên bản 3.2.0 ,ta chọn gói cho Android

Sau khi dowload thành công ta giải nén file zip vừa tải được

Bước 2 : Tạo project Trong Android Studio 

Ta tiến hành tạo project mới có tên TestOpenCV

Sau đó Click Next để tiếp tục

Ở đây mình để Minimum SDK là API 15 cho hệ điều hành Android 4.0.3

Chọn Project Rỗng sau đó nhấn Next để tiếp tục việc tạo Project

Đặt tên cho Activity Name sau đó nhấn Finish

Bước 3 : Import thư viện OpenCV vào Android Studio

Ta vào thư mục OpenCV mà ta đã tải và giải nén chọn vào sdk – > java và lấy đường dẫn giống hình bên dưới nhấn Ctrl + C để copy đường dẫn này ,hiện tại đường dẫn của mình như trong hình là :

C:\Users\PC\Desktop\MyOpenCV\OpenCV-android-sdk\sdk\java

Sau đó chuyển sang Project Android lúc trước mà ta vừa tạo Chọn File -> New -> Import Module

Màn hình Thêm module mới sẽ hiện ra ta tiến hành dán đường dẫn lúc trước đã copy vào đây sau đó Android Studio sẽ nhận ra được thư viện OpenCV ta nhấn vào next để tiếp tục và tiến hành xác nhận thao tác này

Sau đó ta sẽ thấy nó xuất hiện một thông báo lỗi như hình bên dưới ,hãy bình tĩnh và sửa lỗi thôi

Ta tiến hành click chuột phải vào app và chọn Open Module Settings

Sau đó ta click vào app chọn Tab Dependences -> chọn add và chọn Module dependency

Và một hộp thoại hiện lên ta tiến hành việc chọn Module :openCVLibrary320 cho Project sau đó click OK

Thư viện đã được thêm vào click OK 1 lần nữa nhé

Tiếp theo ta vào activity_main.xml vào phần Design để chọn cho đúng cấu hình API hỗ trợ ở đây mình sử dụng Android API 22

 

Mọi thứ đến giờ có lẽ ổn ta tiến hành chọn phần thể hiện thư mục là Project chọn đến openCVLibrary320 tìm đến source và click vào build.gradle để tiến hành thiết lập lại thông tin cho đúng .

CompileSdkVersion mình điền vào là 22 do lúc trước đó mình chạy trên Android API 22 targetSdkVersion cũng vậy.

minSdkVersion thì lúc đầu mình tạo project là 15 đúng không ?

buildToolsVersion cứ để mặc định của nó là 23.0.2

Ta tiến hành đồng bộ Project thử xem có lỗi gì xảy ra nữa không nhé .Để đồng bộ project ta chọn vào File -> Synchronize hoặc ấn tổ hợp phím Ctrl + Alt + Y .

Nếu có thông báo lỗi như hình bên dưới thì Click vào link xanh xanh bên dưới để cài đặt Built Tools phiên bản 23.0.2 cho Project

Nó đang tiến hành việc tải và cài đặt bạn đợi xí nhé ,sau khi tải về đồng bộ cho Project 1 lần nữa như bước trước đó.

Có lẽ mọi thứ vẫn ổn nhưng ta phải tiến hành add thêm các file trong phần native library nữa nó mới chạy được thành công nhé ,ta vào lại Folder ban đầu mà ta tiến hành giải nén vào sdk -> native -> libs sẽ thấy các thư mục như hình bên dưới ta tiến hành copy tất cả các thư mục này ra 1 folder ngoài Desktop cho dễ xử lý .

Đặt tên Folder đó là jniLibs và copy toàn bộ các Folder đó vào đây .

Sau đó vào từng thư mục xóa tất cả các file có đuôi .a ở tất cả các thư mục

arm64-v8a

armeabi

armeabi-v7a

mips

mips64

x86

x86_64

chỉ để lại file có đuôi .so trong các thư mục đó (mỗi folder chỉ có 1 file .so)

Để lại 1 file .so tại mỗi thư mục

Sau khi hoàn thành các bươc trên ta tiến hành copy Folder jniLibs Vào phần thư mục main của project như hình

Trong  actyvity_main.xml ta vào phần Text để thiết kế giao diện có 1 TextView như sau

Sau đó ta chuyển qua lớp MainActivity.java để tiến hành viết code Test chương trình ,nếu OpenCV mà Load thành công thì TextView sẽ có dòng chữ “Load OpenCV Successful”

Nếu sau khi viết code Start chương trình thành công thi sẽ được như hình bên dưới

Các bạn thử cài đặt xem có được không nhé nếu có gì sai sót các bạn để lại bình luận bên dưới để xây dựng bài viết nhé .Mình sẽ ra tiếp Series về OpenCV ,tại mình cũng đang thích thú về nó .Chúc các bạn tạo Project thành công !

Tự Học Lập Trình Vi Điều Khiển Không Cần Mua Mạch Arduino-01 (Led nhấp nháy)

  • GIới thiệu 

Để dễ dàng thực hành và tiếp cận với lập trình vi điều khiển thì Autodesk đã tạo ra môi trường giả lập Arduino  giúp mọi người thực hành trên vi mạch ảo ,tiết kiệm chi phí khi mua vi mạch thật .Chỉ cần thao tác đơn giản là click vào trang https://circuits.io tạo một tài khoản và thực hành ngay.

  • Chương trình led nhấp nháy đầu tiên   

Sau khi tạo tài khoản và đăng nhập thành công ta nhìn trên thanh menu thấy chức năng New chọn New Elictronic Lab như hình bên dưới như vậy chúng ta đã có thể kéo thả các vi mạch vào nối dây và viết code ,chạy chương trình thử nghiệm được rồi .

Ta vào vùng Add Components để chọn mạch và led

Chọn Arduino Uno R3 và 1 con led

Sau khi đã kéo thả vào vùng thiết kế Mạch Arduino Uno và 1 con led màu đỏ thì ta tiến hành lắp chân âm ở GND và chân dương ở chân số 13 (chân dương là chân dài ,còn chân âm là chân ngắn hơn ngoài thực tế)

Sau đó ta tiến hành viết code cho mạch đèn mới lắp ở phần Code Editor


//Khai báo biến cho chân led 13
 int led = 13;

//Hàm khởi tạo thiết lập thông tin các chân
void setup() {
 // thiết lập chế độ cho chân led 13 là phát ra tín hiệu
  pinMode(led, OUTPUT);
}

// Vòng lặp vô hạn cho chương trình
void loop() {
  digitalWrite(led, HIGH); // Bật led tại chân 13
  delay(1000); // Trì hoãn 1 giây
  digitalWrite(led, LOW); // Tắt led tại chân 13
  delay(1000); // Trì hoãn 1 giây
}

Viết code xong ta tiến hành Run code bằng cách bầm vào Start Simulation và đèn bây giờ đã sáng chớp nháy giống như phần mô tả code ở bên trên

Run code here : https://circuits.io/circuits/4721979-the-unnamed-circuit/edit