Emgu CV là một gói bao bên ngoài (wrapper) thư viện xử lí ảnh OpenCV của Intel, cho phép lập trình viên có thể gọi các hàm của OpenCV từ trong các ngôn ngữ .NET C#, VB, VC++, IronPython… Gói này có thể được biên dịch trong Mono và chạy trên Linux / Mac OS X.Tải phiên bản EmguCV mới nhất tại đây (>200MB)http://sourceforge.net/projects/emgucv/files/
Chạy file vừa tải về để cài đặt. Thư mục mặc định là C:\Emgu\emgucv-windows-{phiên bản}( (>500MB).
Thêm control của EmguCV vào Toolbox
Trong Toolbox, click phải lên tab bất kì > chọn Add Tab > gõ tên EmguCV > Enter.Click phải lên tab EmguCV vừa tạo > chọn Choose Items… > hộp thoại hiện ra, chọn tab .NET Framework Components > bấm Browse > duyệt đến thư mục {Emgu folder}\bin > chọn tập tin Emgu.CV.UI.dll > Open > trong ô Filter, gõ Emgu > danh sách các control hiện ra > chọn tất cả > OK.
Kéo thả control vào form
Kéo vào form
- 3 button, lần lượt đặt tên là btnLoadImage, btnHistogram, btnLine
- 1 control PictureBox (nằm trong tab All Windows Forms), đặt tên là pictureBox1
- 1 control histogram của Emgu, đặt tên là histogramBox1
Khai báo các tham chiếu
Trong Solution Explorer, click phải lên tên project > Add reference… > chọn tab Browse > duyệt đến thư mục {Emgu folder}\bin > chọn 3 file Emgu.CV.dll, Emgu.CV.UI.dll,Emgu.Util.dll > OK.Khai báo trong code
using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.Util;
Vào thư mục {Emgu folder}\bin\x86, chép các file sau
cudart32_XXX.dll
npp32_XXX.dll
opencv_coreXXX.dll
opencv_imgprocXXX.dll (XXX là số hiệu phiên bản)
vào thư mục của project {project folder}\bin\Debug
Một số đoạn mã ví dụ
Khai báo biến chứa ảnh
1
| private Image |
Dòng lên trên nghĩa là khai báo đối tượng MyImage thuộc lớp ảnh, có hệ màu là RGB (red, green, blue), và độ sâu màu là Byte, tức giá trị mỗi pixel nằm trong đoạn [0, 255].
Đối với ảnh xám (grayscale), ta khai báo như sau
1
| private Image |
Viết code cho nút Load Image
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| private void btnLoadImage_Click( object sender, EventArgs e) { // khai báo đối tượng OpenFileDialog để chuẩn bị mở hộp thoại duyệt file OpenFileDialog OpenFile = new OpenFileDialog(); // khi hộp thoại hiển thị, nếu người dùng bấm OK // thì nạp file ảnh lên control pictureBox1 if (OpenFile.ShowDialog() == DialogResult.OK) { // gán file hình do người dùng chọn cho biến MyImage Image new Image // hiển thị ảnh lên control pictureBox1 pictureBox1.Image = MyImage.ToBitmap(); } } |
Hiển thị histogram của ảnh
Viết code cho nút Histogram
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| private void btnHistogram_Click( object sender, EventArgs e) { // xóa tất cả histogram hiện có trên control histogramBox1.ClearHistogram(); // khởi tạo đối tượng DenseHistogram DenseHistogram MyHistogram = new DenseHistogram(256, new RangeF(0.0f, 255.0f)); // tính histogram MyHistogram.Calculate( new IImage[] { MyImage[0] }, false , null ); // add histogram vào control histogramBox1.AddHistogram( "Histogram của tui" , Color.Blue, MyHistogram); // vẽ histogram lên control histogramBox1.Refresh(); } |
MyImage[0] là truy xuất đến kênh màu (channel) đầu tiên, tức blue. Kênh màu 1 là green, kênh màu 2 là red.
Để vẽ histogram cho ảnh xám (grayscale), ta thay đổi một chút tại phương thức Calculate.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| private void btnHistogram_Click( object sender, EventArgs e) { // xóa tất cả histogram hiện có trên control histogramBox1.ClearHistogram(); // khởi tạo đối tượng DenseHistogram DenseHistogram MyHistogram = new DenseHistogram(256, new RangeF(0.0f, 255.0f)); // tính histogram MyHistogram.Calculate new Image false , null ); // add histogram vào control histogramBox1.AddHistogram( "Histogram của tui" , Color.Black, MyHistogram); // vẽ histogram lên control histogramBox1.Refresh(); } |
Một cách khác để vẽ histogram
1
2
3
4
5
6
7
8
| private void btnHistogram_Click( object sender, EventArgs e) { // tạo ra 3 histogram cho 3 kênh màu histogramBox1.GenerateHistograms(MyImage, 256); // vẽ histogram lên control histogramBox1.Refresh(); } |
Lưu ý khi chạy chương trình, ta có thể click phải lên control histogram để thực hiện một số chức năng khác có sẵn.
Truy xuất giá trị của pixel trên ảnh
Ví dụ sau vẽ 1 đường thẳng màu đỏ cắt ngang ảnh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| private void btnLine_Click( object sender, EventArgs e) { // biến c chạy từ 0 đến hết độ rộng của ảnh for ( int c = 0; c < MyImage.Width; c++) { // gán giá trị 0 cho của các pixel có tọa độ (150, c) tại kênh màu blue MyImage.Data[150, c, 0] = 0; // gán giá trị 0 cho của các pixel có tọa độ (150, c) tại kênh màu green MyImage.Data[150, c, 1] = 0; // gán giá trị 255 cho của các pixel có tọa độ (150, c) tại kênh màu red MyImage.Data[150, c, 2] = 255; } // hiển thị ảnh lên control pictureBox1 pictureBox1.Image = MyImage.ToBitmap(); } |
Đối với ảnh xám (grayscale), ta truy xuất pixel như sau MyImage.Data[r, c, 0], tức là độ sáng của ảnh tại tọa độ (r, c).
Không có nhận xét nào:
Đăng nhận xét