Thứ Ba, 15 tháng 4, 2014

Tạo dự án EMGU đầu tiên như thế nào?

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.dllEmgu.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 MyImage;
Image có thể hiểu là lớp ảnh, trong đó Color là hệ màu, Depth là độ sâu màu.
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 MyImage;
trong đó giá trị mỗi pixel là độ sáng tại pixel đó, với 0 là tối (đen), và 255 là sáng nhất (trắng).
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 MyImage = new Image(OpenFile.FileName);
        // 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 = newDenseHistogram(256, new RangeF(0.0f, 255.0f));
    // tính histogram
    MyHistogram.Calculate(new IImage[] { MyImage[0] },falsenull);
    // add histogram vào control
    histogramBox1.AddHistogram("Histogram của tui", Color.Blue, MyHistogram);
    // vẽ histogram lên control
    histogramBox1.Refresh();
}
Phương thức Calculate dùng để chiếu ảnh lên histogram. Phương thức này có 3 tham số, trong đó tham số đầu là mảng các ảnh (trường hợp này mảng chỉ có 1 phần tử là MyImage).
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 = newDenseHistogram(256, new RangeF(0.0f, 255.0f));
    // tính histogram
    MyHistogram.Calculate(new Image[] {MyImage}, falsenull);
    // 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