Phát hiện hình ảnh mẫu cố định ra khỏi khung hình bán không đổi


8

Có một số video mà tôi đang tìm cách xử lý các trò chơi video khác nhau để phát hiện các "trạng thái" khác nhau trong đó.

Trò chơi đầu tiên mà tôi đang giải quyết là bất kỳ phiên bản nào của Super Street Fighter 4 .

Trong đó, tôi muốn phát hiện khi màn hình nhân vật "vs" xuất hiện. Đây là một ví dụ về một khung hình của video:

Akuma vs Ryu - SSF4
(lấy từ ~ 10 giây của video này )

Nếu tôi có thể phát hiện "vs", thì tôi có thể phát hiện khung hình video đó thực sự là màn hình "vs", cho phép tôi tìm kiếm thông tin khác (hiện tại, giả sử tôi sẽ sử dụng nó để phát hiện dấu thời gian trong video nơi trận đấu sắp bắt đầu).

Điều đó nói rằng, đây là những gì có thể giả định về các khung hình từ các video mà tôi sẽ xử lý (đây không phải là video duy nhất, có hàng ngàn, nếu không phải hàng chục hoặc hàng trăm nghìn video, nhưng vấn đề về quy mô xử lý nhiều video là một miền hoàn toàn khác nhau):

  • Tôi muốn (nhưng không cần thiết) để xử lý hình ảnh có độ phân giải thấp nhất có thể với kết quả đáng tin cậy (độ phân giải thấp hơn = thời gian xử lý nhanh hơn). Hình ảnh ở trên là 480 x 270 pixel (được lấy từ video YouTube có fmt18 ) nhưng chúng có thể có các kích cỡ khác nhau (Tôi đã nhận được các video YouTube có fmt18 nhưng với kích thước 640 x 360 pixel).
  • Hầu hết các video sẽ được cung cấp trực tiếp
  • Hầu hết các video sẽ có tỷ lệ khung hình 16: 9
  • Nền màu đỏ sẽ là hình động, nhưng nhìn chung là trong màu đỏ cam đó (đó là ngọn lửa)
  • Đôi khi, sẽ có một huy hiệu mờ dần ở phần dưới của "vs" để chỉ ra một phiên bản (điều đó sẽ rất quan trọng, nhưng không phải ngay bây giờ), điều này có thể làm xáo trộn "vs", như vậy:

Sagat so với Adon - SSF4: AE 2012
(lấy từ dấu ~ 3 giây từ video này ; cũng lưu ý rằng ở trên là độ phân giải 640 x 360 pixel)

  • Kích thước và vị trí của "vs" sẽ gần giống nhau (tôi chưa xác minh điều này nhưng tôi biết nó không di chuyển) tỷ lệ với các video nguồn cấp dữ liệu trực tiếp khác
  • Các ký tự sẽ được chọn từ một nhóm hơn 30 ở mỗi bên (nói cách khác, các khu vực của khung sẽ thay đổi)
  • Các video nói chung sẽ có độ dài từ hai đến bốn phút, với khoảng 4.000 đến 6,00 khung hình. Tuy nhiên, có thể có các video dài hơn (có thể là hai giờ) có nhiều trò chơi khác và hành động trực tiếp được cắt. Các video này không quan trọng, nhưng nếu một giải pháp cho tôi biết một trò chơi nào đó xuất hiện trong video tổng thể lớn hơn, thật tuyệt
  • Độ phân giải gốc của ảnh chụp là 720p, do đó, hình ảnh cơ bản của "vs" có thể được chụp ở kích thước "bản địa".

Cuối cùng, tôi đang tìm mã đường ống này trong .NET, nhưng đó không phải là siêu quan trọng, khái niệm bằng chứng-of-là quan trọng hơn ở đây cũng như sự hiểu biết về các kỹ thuật liên quan đến để tôi có thể dịch và tối ưu hóa nó cho .NET cũng như cho các video khác của các trò chơi khác cùng thể loại (nếu tôi có thể chọn ra những người phân biệt đối xử quan trọng và các video nói, Ultimate Marvel vs. Capcom 3 , Street Fighter x Tekken , BlazBlue: Continuum Shift , v.v.).

Tôi cũng nhúng ngón chân vào Mathematica và có phiên bản 8.0 tại nhà, vì vậy một bằng chứng về các khái niệm trong môi trường đó cũng được chào đón nhiều hơn.


Tôi tò mò về lý do tại sao bạn mời chào các phương pháp khác. Bạn đã thử phương pháp tương quan chéo mà yoda đề xuất chưa? Đó là một kỹ thuật tự nhiên rất đơn giản để giải quyết loại vấn đề này và tôi nghĩ nó sẽ hiệu quả với bạn.
Jason R

@JasonR Xin lỗi vì phản hồi muộn. Yoda và tôi thực sự đã thảo luận về cách tiếp cận theo chiều dài và nó hoạt động tốt cho tình huống vì nó bị hạn chế ở trên (kỹ thuật này không tính đến cắt hoặc dịch). Điều đó nói rằng, cả hai chúng tôi đều quan tâm xem liệu có những người khác có cách tiếp cận khác nhau và tiền thưởng là một cách tự nhiên để khuyến khích điều đó.
casperOne

Câu trả lời:


9

Nếu "VS" khá giống nhau (lưu cho một số lớp phủ huy hiệu như trong ví dụ thứ hai), bạn có thể sử dụng tương quan chéo đơn giản để phát hiện sự hiện diện của mẫu trong khung video của bạn. Tôi đã trả lời một câu hỏi tương tự khi thực hiện điều này trong MATLAB trên Stack Overflow. Bạn có thể sử dụng một cái gì đó như công cụ "cây đũa thần" trong Photoshop để chọn "VS" từ khung để tạo mẫu. Tôi đã làm như vậy và binarized hình ảnh để có được mẫu này .

Nhìn vào các kênh màu khác nhau (RGB) trong hai hình ảnh của bạn, kênh màu đỏ dường như là tốt nhất để phát hiện mẫu của bạn.

nhập mô tả hình ảnh ở đây

Bây giờ bạn có thể tương quan chéo kênh màu đỏ với mẫu nhị phân của bạn và bạn sẽ có được một đỉnh ở vị trí của mẫu. Tôi cũng chọn ngưỡng và nhị phân mẫu màu đỏ, mặc dù bạn có thể phát hiện ra nó mà không làm như vậy. Tôi thích sử dụng hàm khoảng cách hơn là các giá trị tương quan chéo thô, vì nó có xu hướng mạnh hơn một chút so với dương tính giả. Tôi không biết C # /. NET, nhưng đây là một phác thảo về cách tiếp cận trong Mathematica:

image = Import["http://i.stack.imgur.com/7RwAh.png"];
ImageCorrelate[ Binarize[ColorSeparate[image][[1]], 0.1], vsTemplate, 
   NormalizedSquaredEuclideanDistance] // Binarize[#, 0.2] & // ColorNegate

cung cấp cho bạn những điều sau đây. Dấu chấm trắng đánh dấu vùng có khoảng cách tối thiểu trong mỗi hai hình ảnh

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

NMN+M-1

Bạn cũng có thể dựa trên điều này và thực hiện một tiêu chí ngưỡng mạnh mẽ hơn của riêng bạn. Bây giờ, tôi sẽ chỉ nêu bật việc phát hiện vì lợi ích của người khác:

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

Bạn có thể tạo ở trên với một chức năng kết hợp:

detectVS[i_Image] := 
 Module[{mask = 
    ImageCorrelate[ Binarize[ColorSeparate[i][[1]], 0.1], vsTemplate, 
       NormalizedSquaredEuclideanDistance] ~Binarize~ 0.2 // 
     ColorNegate},

  ColorConvert[i, "Grayscale"]~ImageAdd~ 
   ImageMultiply[i, Image[mask]~Dilation~ DiskMatrix@100]
  ]

Có rất nhiều tiềm năng để cải thiện ở đây. Tôi là người có sở thích sử dụng ghế bành trong việc xử lý hình ảnh, vì vậy tôi không biết thuật toán nhanh nhất là gì. Tuy nhiên, có một vài điều bạn có thể xem xét:

  1. Nếu VS gần như cùng một vị trí trong mỗi video, bạn không cần tương quan chéo bằng cách sử dụng toàn bộ hình ảnh - bạn chỉ cần chọn một hộp ở giữa và làm việc với nó.
  2. Đây có thể là một hoạt động đắt tiền để làm cho mỗi và mọi khung hình. Tuy nhiên, nhìn vào video của bạn, bạn có các khung hình có giá trị hơn 4 giây trong đó bạn có VS hiển thị và tên nhân vật. Vì vậy, tôi sẽ đề nghị bạn phân tích một khung hình mỗi giây hoặc tối đa cứ sau 2 giây, qua đó đảm bảo rằng bạn sẽ hạ cánh trên một khung hình có VS trên đó. Khi bạn phát hiện ra VS, bạn có thể bắt đầu xử lý mọi khung hình liên tiếp để thực hiện phần tiếp theo của quá trình xử lý.
  3. Quá trình này nên, ở một mức độ hợp lý, mạnh mẽ đối với sự thay đổi kích thước, nghĩa là bạn có thể thực hiện tương quan chéo trên các hình ảnh nhỏ, nhưng bạn sẽ cần một mẫu phù hợp để phù hợp. Nếu bạn biết rằng hình ảnh của bạn sẽ có kích thước bộ / tiêu chuẩn nhất định, thì bạn có thể tạo mẫu cho từng mẫu và chọn mẫu phù hợp tùy thuộc vào kích thước hình ảnh.
  4. Ngưỡng tôi chọn là do dùng thử và lỗi, nhưng chúng dường như hoạt động cho hai hình ảnh ở trên và từ các video youtube liên quan khác, chúng có thể sẽ hoạt động với hầu hết chúng. Một cách tiếp cận chuyên biệt hơn sẽ liên quan đến việc chia nó thành các khối và nhìn vào biểu đồ để suy luận xem nó có thuộc về VS hay không - có lẽ là một bộ phân loại Bayes. Tuy nhiên, hãy chắc chắn rằng bạn cần phải làm điều này trước khi bắt tay vào nó. Dường như với tôi rằng nó đủ đơn giản để bạn không cần nó.

Cho rằng có kích thước "gốc" cho "vs" ở 720p (xem điểm đạn cuối cùng trong câu hỏi được cập nhật), có thể tự động thu nhỏ (giảm, tôi giả sử) với các kích thước của video được quan sát hoặc sẽ bị lệch kết quả tương quan chéo quá nhiều?
casperOne

@casperOne Bạn sẽ có thể thu nhỏ nó xuống mà vẫn làm cho nó hoạt động miễn là bạn chắc chắn rằng hình ảnh thử nghiệm của bạn chỉ được thu nhỏ lại (nghĩa là không bị cắt xén). Mối quan tâm của tôi là trong trường hợp kích thước hình ảnh không như mong muốn. Ví dụ: nếu bạn có một hình ảnh 450x250 ban đầu được cho là 480x270, nhưng đã bị cắt bỏ, việc thu nhỏ một VS thu được từ 640x480 sẽ không cho kết quả phù hợp (mặc dù vậy nó có thể đủ gần). Mặt khác, nếu bạn biết rằng tất cả những hình ảnh đó sẽ là 450x250, thì bạn chỉ cần sử dụng một mẫu từ một trong những khung hình đó.
Lorem Ipsum
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.