Lập trình OpenCV C++ Bài 6 : Kỹ thuật xử lý độ sáng cho ảnh

Hi, xin chào các bạn

Chúng ta sẽ tiếp tục bài kế tiếp trong chủ đề lập trình OpenCV C++

Bài hôm nay chúng ta sẽ thực hiện:  xử lý độ sáng cho ảnh

Là một kỹ thuật hết sức cơ bản, phổ biến cho một tấm ảnh

Nó giúp bạn điều chỉnh độ sáng tối cho ảnh.

Step 1:  Tạo một icon trên toolbar cho chức năng

Cũng tương tự như những bài trước, các bạn hãy tạo 1 icon cho chức năng điều chỉnh độ sáng

 

Sau đó cũng viết hàm xử lý chức năng tại lớp mainframe tương tự như các bài trước

Step 2: Xây dựng dialog điều chỉnh giá trị sáng tối.

Không giống như những bài trước, điều chỉnh sáng tối cần có giá trị thông số được nhập vào

điều chỉnh sáng là một giá trị dương

còn điều chỉnh tối là một giá trị âm

Giá trị gốc ban đầu sẽ là 0.0

Do đó chúng ta sẽ thiết kế một dialog như sau

a. Tạo một dialog trong folder resource của project

Các bạn click chuột phải và chọn insert dialog như sau

Chúng ta sẽ thiết kế một dialog dạng như sau

Về cách thiết kế một dialog trong lập trình MFC,

có thể nhiều bạn chưa biết vì chưa học về mảng lập trình này

Các bạn có thể tham khảo seri học lập trình mfc trên blog của mình :  =====> Click here 

+ Các bạn đặt tên ID của dialog là : IDD_DLG_SETTING (để sau này còn dùng thêm các tham số khác cho xử lý ảnh)

+ Tạo 2 button tăng giảm giá trị với ID minh họa trên ảnh

+ Tạo một label và một edit box có tên ID như ví dụ trên ảnh

Như vậy chức năng của dialog đó là.

Khi ấn vào icon trên toolbar, dialog sẽ được gọi, với giá trị mặc định ban đầu là 0.0

Nếu các bạn ấn vào button +, giá trị sẽ tăng têm 10, sau đó ấn ok thi các bạn sẽ thấy ảnh được sáng hơn

Ngược lại các bạn ấn vào button -, giá trị giảm thêm 10, và sau đó ấn ok thì ảnh sẽ bị tối dần đi.

Ngoài việc tăng giảm giá trị theo button, các bạn cũng có thể nhập trực tiếp.

b. Xây dựng lớp quản lý cho dialog, và các biến quản lý cho các control

Chuột phải vào dialog, các bạn chọn item add class

 

Sau đó đặt tên lớp ví dụ như sau, rồi bấm finish.

 

Các bạn sẽ lớp quản lý cho dialog được xuất hiện

 

Trở lại phần dialog, tiếp tục tạo biến quản lý cho các control

 

Các bạn add btn_decre cho button –

Tương tự add biến edt_adjust_light_ cho control edit box

Và sau đó add tương tự biến btn_incre_ cho button +

c. Tạo các hàm xử lý cho lớp dialog

Viết một hàm BOOL OnIntDialog () để thiết lập các giá trị ban đầu

Hàm này là hàm được tự động gọi khi dialog được show nên không cần khai báo ánh xạ thông điệp

Trong hàm này chúng ta thiết lập giá trị ban đầu cho edit box là 0.0 như sau.

 

Chúng ta khai báo một biến quản lý giá trị trong edit box, gán giá trị khởi tạo cũng là 0.0

Thực hiện xử lý cho button –

Click double vào button – , chương trình sẽ tự động tạo ra một hàm xử lý cho riêng nó,

các bạn tăng giá trị của biến lên

Và sét lại giá trị vào edit box

Tương tự như vậy với button +, các bạn tăng giá trị lên.

 

Viết tiếp một hàm trả ra giá trị trên edit box()

 

Ok, đến đây là xong phần xử lý cho dialog, các bạn build chương trình và đảm bảo không có lỗi, nếu có lỗi hay xem lỗi gì và sửa

Step 3. Thực hiện xử lý sáng tối cho ảnh.

Các bạn quay trở lại lớp mainframe và tại hàm AdjustLight

Chúng ta tiến hành gọi dialog vừa thiết kế ở trên

Tất nhiên hàm AdjustLight của lớp Document là chưa có, và giờ chúng ta sẽ định nghĩa hàm đó

Các bạn sẽ định nghĩa một hàm AdjustLight bên lớp Document và xử lý độ sáng cho ảnh như sau.

Các bạn nhớ khởi tạo cả bên file .h

Về cơ bản việc xử lý độ sáng của ảnh sẽ được thông qua hàm convertTo của lớp cv::Mat

Đối số cuối cùng của hàm này chính là đối số dành cho độ sáng tối, và chúng ta truyền giá trị setting trên dialog vào đối số này.

Các bạn build và chạy thử chương trình.

Khi bấm vào icon mặt trời, sẽ thấy dialog được show lên như sau

 

Kết quả test với giá trị +70

 

Và kết quả test với -50

 

OK, như vậy đến bước này các bạn có thể thành công, và nếu bạn có kinh nghiệm về mfc,

bạn có thể thiết kế giao diện cho phần xử lý ánh sáng này một cách linh động hơn so với việc thiết kế bằng dialog.

Ví dụ như điều chỉnh ánh sáng bằng slider control trên 1 form view chẳng hạn.

Ok. End

 

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.