Cài đặt các kỹ thuật liên quan

Một phần của tài liệu Nghiên cứu một số kỹ thuật xử lý video và ứng dụng vào xây dựng phần mềm giám sát, quản lý tự động các trang trại (Trang 63)

3.3.1 Thiết bị quan sát và lưu trữ

Máy vi tính và Camera quan sát, dữ liệu quan sát được lưu trữ dưới dạng file video. Trong phạm vi của luận văn này, cài đặt và thử nghiệm trên định dạng video là file AVI.

Khảo sát thực tế tại các trang trại chăn nuôi bò sữa:

Diện tích: từ vài trăm đến hàng nghìn ha Số lượng: Trên 5000 con

Sau đây là một số hình ảnh khảo sát thực tế về qui mô trang trại bò sữa tại công ty sữa Vinamilk đặt tại Tuyên Quang:

Phát thảo thiết kế phi hình thức Thiết kế phi hình thức Thiết kế hình thức Thiết kế hoàn chỉnh

Hình3.4. Bò sữa được quản lý theo các ô riêng và được đánh số

Hình 3.5. Một góc của trại bò sữa

3.3.2 Ngôn ngữ cài đặt

Hiện nay có rất nhiều ngôn ngữ lập trình mới và mạnh. Các ngôn ngữ lập trình trên Window vừa có khả năng như các ngôn ngữ chạy trong DOS vừa có khả năng cung cấp một giao diện trực quan giúp người sử dụng giao tiếp với ứng dụng một cách dễ dàng.

Ngôn ngữ lập trình Visual studio 6.0 là một trong những ngôn ngữ như vậy. Với bộ ngôn ngữ này bao gồm Visual C++, Visual Basic,...

3.3.3 Các lớp khai báo sử dụng trong chương trình

Lớp điểm ảnh: POINTAPI, gồm 2 thuộc tính x, y mô tả vị trí 2 chiều của

điểm ảnh trên ảnh số. Lớp ảnh định dạng BMP BITMAPINFO{ bmiHeader As BITMAPINFOHEADER bmiColors() As Integer} BITMAPINFOHEADER { biSize As Long biWidth As Long biHeight As Long biPlanes As Integer biBitCount As Integer biCompression As Long biSizeImage As Long biXPelsPerMeter As Long biYPelsPerMeter As Long biClrUsed As Long biClrImportant As Long}

Lớp Driver cho Webcam CAPDRIVERCAPS{

wDeviceIndex As Long ' // Driver index in system.ini fHasOverlay As Long ' // Can device overlay? fHasDlgVideoSource As Long ' // Has Video source dlg? fHasDlgVideoFormat As Long ' // Has Format dlg? fHasDlgVideoDisplay As Long ' // Has External out dlg? fCaptureInitialized As Long ' // Driver ready to capture? fDriverSuppliesPalettes As Long ' // Can driver make palettes? hVideoIn As Long ' // Driver In channel

hVideoOut As Long ' // Driver Out channel hVideoExtIn As Long ' // Driver Ext In channel hVideoExtOut As Long ' // Driver Ext Out channel}

CAPSTATUS{

uiImageWidth As Long '// Width of the image uiImageHeight As Long '// Height of the image fLiveWindow As Long '// Now Previewing video? fOverlayWindow As Long '// Now Overlaying video? fScale As Long '// Scale image to client?

ptScroll As POINTAPI '// Scroll position

fUsingDefaultPalette As Long '// Using default driver palette? fAudioHardware As Long '// Audio hardware present? fCapFileExists As Long '// Does capture file exist? dwCurrentVideoFrame As Long '// # of video frames cap'td

dwCurrentWaveSamples As Long '// # of wave samples cap'td dwCurrentTimeElapsedMS As Long '// Elapsed capture duration hPalCurrent As Long '// Current palette in use

fCapturingNow As Long '// Capture in progress?

dwReturn As Long '// Error value after any operation wNumVideoAllocated As Long '// Actual number of video buffers wNumAudioAllocated As Long '// Actual number of audio buffers}

CAPTUREPARMS{

dwRequestMicroSecPerFrame As Long '// Requested capture rate fMakeUserHitOKToCapture As Long '// Show "Hit OK to cap" dlg? wPercentDropForError As Long '// Give error msg if > (10%) fYield As Long '// Capture via background task? dwIndexSize As Long '// Max index size in frames (32K) wChunkGranularity As Long '// Junk chunk granularity (2K) fUsingDOSMemory As Long '// Use DOS buffers?

wNumVideoRequested As Long '// # video buffers, If 0, autocalc fCaptureAudio As Long '// Capture audio?

wNumAudioRequested As Long '// # audio buffers, If 0, autocalc vKeyAbort As Long '// Virtual key causing abort

fAbortLeftMouse As Long '// Abort on left mouse? fAbortRightMouse As Long '// Abort on right mouse? fLimitEnabled As Long '// Use wTimeLimit?

wTimeLimit As Long '// Seconds to capture fMCIControl As Long '// Use MCI video source? fStepMCIDevice As Long '// Step MCI device? dwMCIStartTime As Long '// Time to start in MS dwMCIStopTime As Long '// Time to stop in MS

fStepCaptureAt2x As Long '// Perform spatial averaging 2x wStepCaptureAverageFrames As Long '// Temporal average n Frames dwAudioBufferSize As Long '// Size of audio bufs (0 = default) fDisableWriteCache As Long '// Attempt to disable write cache} (adsbygoogle = window.adsbygoogle || []).push({});

Lớp định dạng File AVI AVI_RECT{ left As Long top As Long right As Long bottom As Long} AVI_STREAM_INFO{ fccType As Long fccHandler As Long dwFlags As Long dwCaps As Long wPriority As Integer wLanguage As Integer dwScale As Long dwRate As Long dwStart As Long

dwLength As Long dwInitialFrames As Long dwSuggestedBufferSize As Long dwQuality As Long dwSampleSize As Long rcFrame As AVI_RECT dwEditCount As Long dwFormatChangeCount As Long szName As String * 64}

3.3.4 Một số dll truy xuất từ window

User32.dll Avicap32.dll Gdi32.dll Msvfw32.dll Avifil32.dll Kernel32.dll

3.3.5 Phát hiện và đánh dấu chuyển động của đối tượng trong Camera cố định cố định

Sơ đồ môt tả thuật toán phát hiện chuyển động của đối tượng như sau:

Lược đồ 3.1. Lưu ảnh và phát hiện chuyển động

Input: Dữ liệu là ảnh thu được từ Webcam

Output: Phát hiện và đánh dấu đối tượng vận động Thuật toán:

Bước 1: Thu ảnh từ Webcam, với mỗi điểm ảnh thu được từ ảnh này, tiến hành phân tích ra các thành phần màu Red, Green, Blue.

c = Picture1.Point(i * inten * Tppx, j * inten * Tppy) ‘ Phân tích điểm ảnh thành Red, Green, Blue

Begin Old=bắt ảnh từ camera Cur=bắt ảnh từ camera Old = Cur Dif >=20

Lưu Old, Cur vào đĩa Dif = Cur - Old

R = c Mod 256

G = (c \ 256) Mod 256

B = (c \ 256 \ 256) Mod 256

Bước 2: Tương tự, thu ảnh từ Webcam và tiến hành phân tích màu cho mỗi điểm ảnh ra các thành phần màu R, G, B.

c2 = P(i, j)

‘P(i, j) = Picture1.Point(i * inten * Tppx, j * inten * Tppy) R2 = c2 Mod 256

G2 = (c2 \ 256) Mod 256 B2 = (c2 \ 256 \ 256) Mod 256

Bước 3: Tiến hành tính toán độ sai khác giữa hai ảnh dựa vào một mức ngưỡng được chọn (thực nghiệm 20).

Tính tổng vị trí sai khác của hai ảnh, cập nhật vị trí sai khác

If Abs(R - R2) < Tolerance And Abs(G - G2) < Tolerance And Abs(B - B2) < Tolerance Then Ri = Ri + 1 POn(i, j) = True Else Wo = Wo + 1

P(i, j) = Picture1.Point(i * inten * Tppx, j * inten * Tppy) Picture1.PSet (i * inten * Tppx, j * inten * Tppy), vbRed POn(i, j) = False

End If

Bước 4: Xác định vận động thực của đối tượng

Một điểm là vận động thực nếu chính nó và 4 điểm láng giềng đều có sự sai khác.

If POn(i, j) = False and POn(i, j + 1) = False and POn(i, j - 1) = False and POn(i + 1, j) = False and POn(i - 1, j) = False Then

RealRi = RealRi + 1

Picture1.PSet (i * inten * Tppx, j * inten * Tppy), vbGreen (adsbygoogle = window.adsbygoogle || []).push({});

Hình 3.6. Một số hình ảnh về khoanh vùng chuyển động

3.3.6 Thuật toán trừ nền cơ bản (dùng cho file AVI thu được từ camera cố định) camera cố định)

Hướng tiếp cận phổ biến để phát hiện đối tượng chuyển động là so sánh khung hình hiện tại với khung hình liền trước. Kỹ thuật này rất tốt trong việc nén video khi mà chúng ta chỉ cần đánh giá sự thay đổi và chỉ cần ghi lại những thay đổi, mà không cần phải ghi lại toàn bộ khung hình đó. Nhưng kỹ thuật này chưa được tốt cho các ứng dụng phát hiện đối tượng chuyển động. Dưới đây, chúng ta sẽ xem xét trường hợp phát hiện đối tượng chuyển động dựa trên hướng tiếp cận trừ khung hình hiện tại với khung hình liền trước.

3.3.6.1 Phát hiện đối tượng chuyển động dựa theo hướng tiếp cận trừ khung hình liền kề khung hình liền kề

Giả sử, chúng ta có tệp ảnh động video định dạng avi, với các thông số thuộc tính như Hình 3.1 sau đây

Hình 3.7. Thuộc tính của file video dạng avi

Các khung hình được lấy từ file video có dạng RGB 24 bit, và được chuyển sang ảnh 256 cấp xám. Chúng ta gọi khung hình hiện thời là Fcur, khung hình liền trước Fpre. Khung hình Fgreyc, Fgreyp cùng là ảnh xám 256 màu, sử dụng công thức phối màu: Grey = 0.333R+0.333G+0.333B. Khi đó ảnh màu RGB được chuyển sang ảnh xám 256 màu như sau:

//Ảnh hiện thời

ColorFcur=(Fcur(i,j).Red + Fcur(i,j).Green + Fcur(i,j).Blue)/3; Fgreyc(i,j).Blue= ColorFcur;

Fgreyc(i,j).Green= ColorFcur; Fgryec(i,j).Red= ColorFcur;

//Ảnh liền trước

ColorFpre=(Fpre(i,j).Red + Fpre(i,j).Green + Fpre(i,j).Blue)/3; Fgreyp(i,j).Red= ColorFpre;

Fgreyp(i,j).Green= ColorFpre; Fgreyp(i,j).Blue= ColorFpre;

Tiếp theo, Fgreyc, Fgreyp được trừ theo từng điểm ảnh, và được so sánh với ngưỡng. Nếu giá trị tuyệt đối nhỏ hơn giá trị ngưỡng thì coi là điểm giống nhau, ngược lại coi là khác nhau. Tức là, tại vị trí i,j:

if(abs(ColorFpre- ColorFcur)<lThreshold) //giống nhau

{ Iwb(i,j).Red=0; Iwb(i,j).Green=0; Iwb(i,j).Blue=0; } else //khác nhau { Iwb(i,j).Red=255; Iwb(i,j).Green=255; Iwb(i,j).Blue=255; }

Iwb là ảnh đen trắng thể hiện vùng khác nhau giữa 2 khung hình, những điểm khác nhau sẽ có màu trắng, ngược lại có màu đen. Dưới đây là một số hình minh họa của kỹ thuật trừ ảnh liền kề với ngưỡng được đặt là 20.

a- khung hình liền trước Fpre b- khung hình hiện thời Fcur

Hình 3.8. Ảnh khung hình liền trước và hiện thời có sai khác ít.

a) Ảnh khung hình liền trước, b) Ảnh khung hình hiện thời, c) Ảnh đen trắng dùng kỹ thuật trừ ảnh liền kề, với ngưỡng là 20.

c- ảnh thu được khi trừ ảnh

a- khung hình liền trước Fpre b- khung hình hiện thời Fcur

Hình 3.9. Ảnh khung hình liền trước và hiện thời có sai khác nhiều.

a) Ảnh khung hình liền trước, b) Ảnh khung hình hiện thời, c) Ảnh đen trắng dùng kỹ thuật trừ ảnh liền kề, với ngưỡng là 20.

c- ảnh thu được khi trừ ảnh

Theo kết quả thực nghiệm cho thấy: Nếu chúng ta giảm giá trị ngưỡng thì sẽ tăng được độ phân biệt giữa các khung hình gần giống nhau, nhưng cũng sẽ làm tăng vùng khác nhau đối với khung hình có độ khác nhau nhiều, do đó sẽ làm cho quá trình xử lý phức tạp hơn. Như vậy, với kỹ thuật trừ khung hình liền kề chúng ta có được nhận xét sau:

 Chưa tối ưu được quá trình xử lý, vì phải xử lý tất cả khung hình có trong đoạn video mặc dù chúng không có sự thay đổi (các đối tượng không chuyển động).

 Thu được những thay đổi nhỏ đối với những đối tượng có chuyển động chậm và có thể là không phân biệt được vì thay đổi ít, vì vậy mà khó có thể lấy được toàn bộ đối tượng chuyển động.

 Chứa nhiều nhiễu, do thời tiết, độ tương phản, độ bóng làm thay đổi giá trị màu ở những vùng không chuyển động.

Vì vậy, chúng ta sẽ không thực hiện trừ khung hình liền kề để phát hiện đối tượng. Dưới đây chúng ta sẽ xem xét một hướng tiếp cận kết hợp: kỹ thuật trừ khung hình, đo độ thay đổi, xét vị trí, và kỹ thuật dò biên ảnh đa cấp xám để nâng cao hiệu quả phát hiện đối tượng chuyển động. (adsbygoogle = window.adsbygoogle || []).push({});

3.3.6.2 Phát hiện đối tượng chuyển động theo hướng tiếp cận kết hợp

Đây cũng là một hướng tiếp cận dựa trên kỹ thuật trừ ảnh, độ đo tương tự, xét vị trí tương đối giữa các vùng thay đổi giá trị màu ở các khung hình, phát hiện biên ảnh đa cấp xám. Hướng tiếp cận này được trình bày như sau:

Đầu tiên, phát hiện vùng thay đổi về giá trị màu giữa các khung hình theo kỹ thuật trừ ảnh điểm. Nếu 2 điểm được so sánh mà có giá trị khác nhau nhỏ hơn một ngưỡng cho trước thì chúng được coi là giống nhau, ngược lại chúng được coi là khác nhau, và được đánh dấu lại vào ảnh Iwb. Quá trình khử nhiễu bằng các cửa sổ 5x5, 3x3 trên ảnh đen trắng Iwb và xác định độ dịch chuyển sẽ khử nhiễu do thời tiết, độ từng phận. Tiếp theo, ảnh Fgreyc được phát hiện biên cho kết quả là ảnh Feg (ảnh biên). Kết hợp Feg với Iwb, chúng ta sẽ loại bỏ được tất cả những điểm biên nằm ngoài vùng chuyển động (có màu trắng), lấy được biên của đối tượng chuyển động. Những điểm biên của Feg và lân cận vùng trắng sẽ được đánh dấu lại. Cuối cùng chúng ta xử lý điểm biên được đánh dấu để xác định được đối tượng chuyển động.

Dưới đây là bước thực hiện của thuật toán phát hiện đối tượng chuyển động theo hướng tiếp cận kết hợp.

Bước 1 : Trừ ảnh và đánh dấu Iwb

Bước 2 : Lọc nhiễu trên ảnh Iwb, phát hiện độ dịch chuyển Bước 3 : Phát hiện biên Feg

Bước 4 : Kết hợp Fgreyc với Iwb

Tiếp theo, chúng ta sẽ xem xét cụ thể hơn các bước thực hiện của hướng tiếp cận kết hợp dựa trên kỹ thuật trừ điểm ảnh và biên.

3.3.6.2.1 Trừ ảnh và đánh dấu Iwb

Đây là bước phát hiện vùng khác biệt dựa trên kỹ thuật trừ điểm ảnh, giá trị ngưỡng Threshold = 20. Tiến hành trừ từng điểm ảnh của Fgreyc với Fgreyp Khác với kỹ thuật trừ ảnh liền kề, trong quá trình trừ điểm ảnh, chương trình sẽ đếm số điểm Count giống nhau trên toàn vùng ảnh. Nếu giá trị tuyệt đối của hiệu số Count với Isize (kích thước ảnh) lớn hơn một giá trị ngưỡng thì được coi là khác nhau, ngược lại 2 khung hình được coi là giống nhau. Do đó, quá trình xử lý chỉ xem xét với những khung hình khác nhau đáng kể.

3.3.6.2.2 Lọc nhiễu và phát hiện độ dịch chuyển

Đây là bước để hạn chế được các vùng đốm dựa theo cửa sổ lọc nhiễu được chọn là 5x5, 3x3 và vị trí thay đổi của vùng ảnh. Một tập Iwb được xử lý để lấy được vị trí của vùng sáng. Nếu vị trí của vùng sáng thay đổi nhỏ hơn một giá trị ngưỡng thì được coi là nhiễu, và lập tức được loại bỏ. Kết quả chúng ta có được ảnh đen trắng Iwb được lọc. Vùng sáng có độ lớn 1 điểm ảnh sẽ được loại bỏ bởi cửa sổ 3x3.

Hình 3.4 dưới đây minh họa kết quả của ảnh Iwb chưa lọc nhiễu và đã được lọc nhiễu.

a- khung hình liền trước Fpre b- khung hình hiện thời Fcur

c- ảnh thu được khi trừ ảnh d- ảnh thu được sau lọc nhiễu

Hình 3.10. a), b) là 2 khung hình có độ sai khác thỏa mãn ngưỡng, c) Ảnh Iwb chưa lọc nhiễu, d) là ảnh Iwb sau khi lọc nhiễu

3.3.6.2.3 Kết hợp ảnh Fgreyc với Iwb

Ảnh sau khi đã được phát hiện biên Feg được xếp chồng với ảnh đen trắng Iwb. Vùng đen trắng kết hợp với điểm biên sẽ cho ta được tập hợp các điểm bao quanh vùng chuyển động. Những điểm biên của Feg gần với vùng trắng của Iwb được đánh dấu lại trên Fgreyc.

3.3.7 Thuật toán phát hiện vận động toàn diện của đối tượng Thu ảnh từ camera và lưu trữ dưới dạng file Video: Thu ảnh từ camera và lưu trữ dưới dạng file Video:

Bước 1: Xác định tên tập tin lưu trữ, thiết lập (xác định) số hiệu khung ảnh khởi đầu và số hiệu khung ảnh cuối cùng, đồng thời xác định tốc độ khung ảnh trong video.

Bước 2: Đọc dữ liệu ảnh và lưu vào tập tin ảnh (thời gian đợi lưu ảnh) Bước 3: Nếu là khung ảnh cuối cùng thì dừng việc lưu ảnh,

ngược lại thì quay lại bước 2.

Lược đồ:

Lược đồ 3.2: Thu ảnh từ camera và lưu trữ

Phát hiện đối tượng vận động

Bước 1: Lấy dữ liệu về điểm ảnh của khung ảnh

Bước 2: So sánh với dữ liệu điểm ảnh nền được chọn ban đầu

Bắt đầu

Nhập tên tập tin lưu trữ Đặt số khung ảnh bắt đầu

Đặt số khung ảnh cuối Đặt tốc độ khung ảnh (adsbygoogle = window.adsbygoogle || []).push({});

Đọc dữ liệu điểm ảnh

Lưu vào tập tin ảnh Đợi lưu ảnh Khung ảnh kế tiếp Khung ảnh cuối cùng? Kết thúc đúng sai

Bước 3: Nếu có sự sai khác lớn hớn ngưỡng cho phép thì điểm ảnh nằm trong đối tượng vận động, ngược lại thì điểm ảnh nằm ngoài đối tượng vận động.

Bước 4: Nếu là điểm ảnh cuối cùng thì kết thúc, nếu chưa thì quay lại bước 1.

Lược đồ:

Lược đồ 3.3: Phát hiện đối tượng vận động

Đánh giá vận động của đối tượng

Bước 1: Xác định tên tập tin vào, đặt số hiệu khung ảnh bắt đầu và số hiệu khung ảnh cuối cùng

Bước 2: Lấy khung ảnh đầu tiên, phát hiện vùng đối tượng

Bước 3: Nếu đúng là khung ảnh cuối cùng thì lưu dữ liệu vận động của đối tượng và kết thúc, nếu không đúng thì sang bước 4.

Bước 4: Lấy khung ảnh kế tiếp, phát hiện vùng đối tượng, tính toán vùng vận động sai

Một phần của tài liệu Nghiên cứu một số kỹ thuật xử lý video và ứng dụng vào xây dựng phần mềm giám sát, quản lý tự động các trang trại (Trang 63)