2010-07-06 42 views
7

Hiện tại tôi đang thực tập tại một công ty phần mềm và một trong những nhiệm vụ của tôi là triển khai công nhận cử chỉ của chuột. Một trong những nhà phát triển cao cấp đã giúp tôi bắt đầu và cung cấp mã/dự án sử dụng $ 1 Unistroke Recognizer http://depts.washington.edu/aimgroup/proj/dollar/. Tôi nhận được, theo cách rộng, Bộ nhận dạng Unistroke 1 đô la đang hoạt động như thế nào và cách thức hoạt động nhưng hơi bị choáng ngợp khi cố hiểu tất cả các chi tiết bên trong/chi tiết hơn của nó.Làm thế nào để xác định tất cả các đoạn đường từ một danh sách các điểm được tạo ra từ một cử chỉ con chuột?

Vấn đề của tôi là tôi đang cố gắng nhận ra cử chỉ di chuyển chuột xuống, sau đó lên trên. $ 1 Unistroke Recognizer xác định rằng cử chỉ mà tôi tạo ra là một cử chỉ hướng xuống, điều đó là không thể thực hiện được những gì nó phải làm. Những gì tôi thực sự muốn nó làm là nói "Tôi nhận ra một cử chỉ downards VÀ THEN một cử chỉ trở lên."

Tôi không biết liệu sự thiếu hiểu biết của Trình nhận dạng Unistroke 1 đô la có khiến tôi gãi đầu hay không, nhưng có ai có ý tưởng nào về cách nhận biết hai cử chỉ khác nhau khi di chuyển chuột xuống dưới không? Đây là ý tưởng của tôi mà tôi nghĩ có thể giúp tôi nhưng rất thích một người chuyên gia hoặc thậm chí biết nhiều hơn một chút so với tôi để cho tôi biết suy nghĩ của bạn. Bất kỳ trợ giúp hoặc tài nguyên nào mà bạn biết sẽ là rất nhiều đánh giá cao.

Làm thế nào ứng dụng của tôi hiện đang hoạt động:

Cách mà ứng dụng hiện tại của tôi làm việc là tôi chụp điểm từ nơi con trỏ chuột là khi người dùng giữ nút chuột trái. Một danh sách các điểm sau đó được đưa đến một trình nhận dạng cử chỉ và sau đó nó phát ra những gì nó cho là hình dạng/cử chỉ tốt nhất mà cooresponds đến các điểm bị bắt.

Idea của tôi:

Những gì tôi muốn làm là trước khi tôi ăn điểm với nhận dạng cử chỉ là bằng cách nào đó đi qua tất cả các điểm và phá vỡ chúng xuống dòng riêng biệt hoặc đường cong. Bằng cách này, tôi có thể cho mỗi dòng/đường cong vào từng dòng một và từ các chuyển động cơ bản của xuống, lên, trái, phải, đường chéo và đường cong, tôi có thể xác định hình dạng/cử chỉ cuối cùng.

Một cách tôi nghĩ sẽ tốt khi xác định xem có các dòng riêng biệt trong danh sách các điểm của tôi là lấy mẫu các điểm và nhìn vào độ dốc của chúng hay không. Nếu độ dốc của một nhóm điểm lấy mẫu khác với X% từ một số nhóm lấy mẫu khác thì sẽ an toàn khi cho rằng thực sự có một dòng riêng biệt.

gì tôi nghĩ là có thể xảy ra vấn đề trong suy nghĩ của tôi:

  • ở đâu để tôi xác định khi kết thúc một dòng và sự bắt đầu của một dòng riêng biệt? Nếu tôi sử dụng ý tưởng kiểm tra độ dốc của một nhóm điểm và sau đó xác định rằng có một dòng riêng biệt hiện tại không có nghĩa là tôi đã không tìm thấy được độ dốc của một đường riêng biệt. Ví dụ: nếu bạn vẽ một chữ "L" thẳng với góc vuông và lấy mẫu độ dốc của các điểm xung quanh góc "L", bạn sẽ thấy rằng độ dốc sẽ cho dấu hiệu cộng hưởng có một dòng riêng biệt nhưng những điểm đó không tương ứng với sự bắt đầu của một dòng riêng biệt.

  • Làm thế nào để đối phó với độ dốc thay đổi bao giờ của đường cong? Trình nhận dạng cử chỉ mà tôi sử dụng các đường cong xử lý đã theo cách tôi muốn.Nhưng tôi không muốn phương pháp của tôi mà tôi sử dụng để xác định các đường riêng biệt tiếp tục tìm kiếm những dòng này được gọi là các đường riêng biệt trong một đường cong bởi vì độ dốc của nó thay đổi tất cả thời gian khi tôi lấy mẫu các điểm. Tôi có thể dừng các điểm lấy mẫu khi độ dốc thay đổi nhiều hơn X% nhiều lần liên tiếp không?

  • Tôi không sử dụng đúng "loại" toán học để xác định các dòng riêng biệt. Toán học không phải là môn học mạnh nhất của tôi nhưng tôi đã làm một số nghiên cứu. Tôi đã cố gắng nhìn vào Dot Products và xem liệu điều đó có thể chỉ cho tôi theo một hướng nào đó hay không, nhưng tôi không biết liệu nó có thành công hay không. Có ai sử dụng Dot Prodcuts để làm một cái gì đó như thế này hay một số phương pháp khác?

Suy nghĩ cuối cùng, chú thích, Và Thanks:

Một phần của vấn đề của tôi, tôi cảm thấy thích là tôi không biết làm thế nào để compeletly hỏi câu hỏi của tôi. Tôi sẽ không ngạc nhiên nếu vấn đề này đã được yêu cầu (bằng cách này hay cách khác) và một giải pháp tồn tại có thể là Google. Nhưng kết quả tìm kiếm của tôi trên Google không cung cấp bất kỳ giải pháp nào vì tôi không biết chính xác cách đặt câu hỏi của mình. Nếu bạn cảm thấy như nó là khó hiểu xin vui lòng cho tôi biết ở đâu và tại sao và tôi sẽ giúp làm rõ nó. Khi làm như vậy, các tìm kiếm của tôi trên Google sẽ trở nên chính xác hơn và tôi sẽ có thể tìm ra giải pháp.

Tôi chỉ muốn cảm ơn lần nữa vì đã đọc bài đăng của tôi. Tôi biết nó dài nhưng không thực sự biết nơi khác để hỏi nó. Imma nói chuyện với một số người khác xung quanh văn phòng nhưng tất cả các giải pháp tốt nhất của tôi tôi đã sử dụng trong suốt trường học đã đến từ cộng đồng StackOverflow vì vậy tôi nợ nhiều nhờ bạn.

Chỉnh sửa To This Post:

(7/6 4:00 PM) Một ý tưởng tôi nghĩ về được so sánh tất cả các điểm trước khi một điểm Min/Max. Ví dụ, nếu tôi di chuyển chuột downards sau đó trở lên, điểm bắt đầu của tôi sẽ là điểm Max hiện tại trong khi điểm mà tôi bắt đầu di chuyển con chuột trở lên trở lên sẽ là điểm tối thiểu của tôi. Sau đó tôi có thể tiếp tục và xem xét xem có bất kỳ điểm nào sau điểm tối thiểu và nếu có thể nói rằng có thể có một dòng tiềm năng mới. Tôi không biết nó sẽ hoạt động tốt như thế nào trên các hình dạng khác như sao nhưng đó là một điều khác mà Im sẽ xem xét. Có ai đã làm một cái gì đó tương tự như thế này trước đây?

+0

Bạn có hài lòng không nếu Trình nhận dạng của bạn nhận ra đây là một cử chỉ đơn lẻ "XUỐNG LÊN", hay bạn thực sự muốn nó bẻ cử chỉ xuống một chuỗi hai cử chỉ nguyên thủy, {DOWN, UP}? – Beta

+1

Nếu tôi hiểu chính xác bạn đã có một chuỗi các dòng, được xác định bởi mỗi cặp điểm, nhưng muốn đơn giản hóa - chỉ là các dòng "dự định". Tôi đề nghị bạn hãy xem thuật toán đơn giản hóa dòng Douglas-Peucker. Nó sẽ cung cấp cho bạn những gì bạn đang tìm kiếm. http://www.cs.sunysb.edu/~algorith/implement/DPsimp/implement.shtml –

+0

Tôi sẽ hài lòng nếu nó nhận ra nó như là một cử chỉ duy nhất "DOWN-UP".Nhưng nó vẫn sẽ là quan trọng để biết làm thế nào để làm một cái gì đó như viết lên trong bài gốc của tôi trong trường hợp đó là không thỏa đáng nữa. Cảm ơn Vitor. Hãy nhìn vào điều đó ngay bây giờ. : D – Chris

Trả lời

1

Nếu vấn đề của bạn có thể bị thu hẹp để phá vỡ một đường cong chung thành các đường thẳng một phần cong thẳng hoặc trơn tru thì bạn có thể thử điều này.

So sánh độ dốc của các phân đoạn và xác định các điểm phá vỡ khi nó lớn hơn thì một số ngưỡng sẽ hoạt động trong một trường hợp rất đơn giản. Hãy tưởng tượng một hình chữ L hoàn hảo, nơi bạn có một góc vuông giữa hai đường thẳng. Rõ ràng là điểm góc sẽ là điểm duy nhất nơi chênh lệch độ dốc nằm trên ngưỡng miễn là ngưỡng nằm trong khoảng từ 0 đến 90 độ, và do đó một điểm phá vỡ có thể nhận dạng được.

Tuy nhiên, các đường thẳng đứng và nằm ngang có thể hơi cong nên ngưỡng sẽ cần đủ lớn để những khác biệt nhỏ này có thể bị bỏ qua dưới dạng điểm phá vỡ. Bạn cũng sẽ phải quyết định một góc mà thuật toán sẽ được giải quyết như thế nào. là 90 độ hoặc cao hơn yêu cầu, hoặc thậm chí là 30 deg đủ? Đây là một câu hỏi quan trọng.

Cuối cùng, để làm cho điều này mạnh mẽ, tôi sẽ không hài lòng khi so sánh các sườn của hai đoạn liền kề. Tay có thể lắc, các góc có thể được làm nhẵn và các điều kiện lý tưởng để tìm các đường thẳng và các góc nhọn có thể sẽ không bao giờ xảy ra. Đối với mỗi điểm được khảo sát để nghỉ ngơi, tôi sẽ lấy độ dốc trung bình của các đoạn trước đó là N và so sánh nó với độ dốc trung bình của các đoạn sau N.Điều này có thể được triển khai hiệu quả bằng cách sử dụng chạy có nghĩa là. Bằng cách chọn một số mẫu tốt N (tùy thuộc vào độ chính xác của đầu vào, tổng số điểm, v.v.), thuật toán có thể tránh nhiễu và phát hiện tốt hơn.

Về cơ bản các thuật toán sẽ là:

  • Đối với mỗi điểm điều tra (bắt đầu N điểm vào chuỗi và kết thúc N điểm trước khi kết thúc.)
    • Tính độ dốc trung bình của N phân đoạn trước đó.
    • Độ dốc trung bình tính toán của các phân đoạn tiếp theo là N.
    • Nếu chênh lệch giá trị trung bình lớn hơn Ngưỡng , đánh dấu điểm hiện tại là điểm phá vỡ.

Điều này khá ngoài đầu của tôi. Bạn sẽ phải thử nó trong ứng dụng của bạn.

+0

Tôi chắc chắn thích ý tưởng của bạn. Tôi biết rằng với một thực tế, tôi sẽ có thể nhận ra các đường có một góc từ 10 đến 170 độ. Khá nhiều từ một con người đứng điểm nếu họ có thể phân biệt rằng có một số góc (có hay không các dòng được mịn) sau đó tôi cần để có thể phân biệt các phân đoạn dòng riêng biệt. Theo như một N tốt tôi đoán tôi sẽ chỉ phải thử nghiệm? Hiện tại, đặc tả/thiết kế của tôi cung cấp một danh sách các điểm không nhiều hơn hoặc ít hơn 64 mục. Cũng có vấn đề gì điểm tôi sử dụng cho độ dốc? Tôi có thể sử dụng điểm 1 và 5 để có độ dốc không? – Chris

+0

Có, N sẽ phải được chọn bằng thử và sai. Nếu nó quá nhỏ, bạn sẽ nhận được những tiếng cười nhỏ như những dòng riêng biệt và bỏ lỡ những góc cong mà lẽ ra đã bị phá vỡ. Nếu nó quá lớn, mặt khác, bạn có thể phá vỡ các đường cong trơn tru và bỏ lỡ các góc được bản địa hóa như góc giữa trong một dấu ngoặc nhọn ({). Giữ nó tinh chỉnh và bạn chắc chắn sẽ tìm thấy một số thiết lập phù hợp. Đối với độ dốc, tôi sẽ chỉ sử dụng các điểm liền kề. (1, 2), (2nd, 3rd), vv Bằng cách sử dụng N-trung bình các sườn xa hơn từ điểm kiểm tra tự nhiên sẽ được cân nhắc vào kết quả. –

1

nếu bạn làm việc với các góc tuyệt đối, như lên trên và xuống dưới, bạn có thể đơn giản lấy độ dốc tuyệt đối giữa hai điểm (không nhất thiết là lân cận) để xác định xem nó là RIGHT, LEFT, UP, DOWN (nếu đủ)

nghệ thuật là để tìm một khoảng cách giữa các điểm sao cho góc không phải là ngẫu nhiên (với 1px, góc sẽ là một bội số của 45 °)

có một plugin firefox cho Navigation bằng cử chỉ chuột mà hoạt động rất tốt. Tôi nghĩ đó là FireGestures, nhưng tôi không chắc chắn. Tôi đoán bạn có thể lấy cảm hứng từ đó

Suy nghĩ bổ sung: Nếu bạn vẽ hình bằng các điểm liên tiếp, sau đó kết nối lại điểm đầu tiên, tỷ lệ giữa khu vực và chiều dài của đoạn cuối cùng cũng là chỉ báo đối với cử chỉ "edginess"

+0

Góc của tôi không thực sự hoàn toàn vì tôi có thể kiểm tra và nhận ra cử chỉ đường chéo. Tôi nghĩ đó là những gì bạn đang yêu cầu? Tôi không nghĩ rằng tôi hoàn toàn hiểu bài viết của bạn khi bạn cũng nói rằng nghệ thuật là để tìm một khoảng cách giữa các điểm sao cho góc không phải là ngẫu nhiên. Ill cũng nhìn vào plugin FireFox. Cảm ơn một lần nữa! : D – Chris

+0

Tôi có nghĩa là không cần biết cử chỉ quay là gì. bạn chỉ cần biết nếu một dòng đi xuống, không phải nếu cử chỉ tổng thể tạo thành một số hình dạng phức tạp như một nửa vòng tròn, có thể là nửa trên hoặc nửa dưới. Tuyên bố thứ hai của tôi là nếu khoảng cách quá nhỏ, người dùng không thể kiểm soát chính xác hướng đi của mình. Ví dụ. nếu bạn vẽ một đường thẳng xuống, bạn sẽ có một vài điểm ảnh tắt. Nếu bạn đối xử với mỗi hai điểm là các đường riêng lẻ, những điểm mà bạn nhận được sai sẽ bị tắt 45 độ. Nhưng nếu các đoạn đường của bạn quá dài, bạn không thấy các cạnh. Công việc của bạn là chọn khoảng cách cân bằng –

1

Nếu bạn chỉ quan tâm đến lên/xuống/trái/phải, lần đầu tiên gần đúng là kiểm tra 45 phân đoạn độ của một vòng tròn. Điều này có thể dễ dàng thực hiện bằng cách kiểm tra sự khác biệt theo chiều ngang giữa (liên tiếp) điểm so với sự khác biệt theo chiều dọc giữa các điểm.

Giả sử bạn có chênh lệch ngang dương lớn hơn so với chênh lệch theo chiều dọc, thì đó sẽ là 'QUYỀN'.

Khó khăn duy nhất sau đó là ví dụ, để phân biệt UP/DOWN từ UP/RIGHT/DOWN. Nhưng điều này có thể được thực hiện bằng khoảng cách giữa các điểm. Nếu bạn xác định rằng chuột đã di chuyển RIGHT ít hơn 20 pixel, thì bạn có thể bỏ qua chuyển động đó.

Các vấn đề liên quan