2012-06-05 31 views
5

Tôi đang cố gắng sử dụng cv::calcOpticalFlowPyrLK nhưng đôi khi một xác nhận nội bộ trong hàm đó không thành công. Xác nhận là npoints = prevPtsMat.checkVector(2, CV_32F, true)) >= 0. Tôi đang sử dụng OpenCV 2.3.1. Mã nguồn cho chức năng này có sẵn here.cv :: goodFeaturesToTrack không trả lại bất kỳ tính năng nào

Thật khó để quấn đầu của tôi xung quanh mã của họ, đặc biệt là vì kinh nghiệm hạn chế của tôi với đồ họa máy tính và thiếu nhận xét của họ. Tại sao xác nhận này được kích hoạt và nó nói gì về vấn đề của tôi?

Sửa: Tôi gọi hàm như sau:

cv::calcOpticalFlowPyrLK(curBwFrame, prvFrame, features, newFeatures, trackingStatus, errors); 

tôi phát hiện ra rằng features vector, mà được thu thập bằng cách gọi cv::goodFeaturesToTrack(curBwFrame, features, 5, 0.2, 0.5, skinMask); với một mặt nạ không có sản phẩm nào đó dường như là đủ lớn và một hình ảnh hợp lệ, không chứa bất kỳ tính năng nào. Làm thế nào điều này có thể xảy ra?

curBwFrame

curBwFrame

skinMask

skinMask

tôi có thể tạo lại vấn đề bằng cách sử dụng đoạn mã sau:

#include <vector> 
#include <cassert> 
#include <opencv2\opencv.hpp> 
using std::vector; 
using namespace cv; 

int main() { 
    vector<Point2f> features; 
    cv::Mat curBwFrame = imread("curBwFrame.png"); 
    cv::cvtColor(curBwFrame, curBwFrame, CV_RGB2GRAY); 
    imwrite("test.png", curBwFrame); 

    cv::Mat skinMask = imread("skinMask.png"); 
    cv::cvtColor(skinMask, skinMask, CV_RGB2GRAY); 
    imwrite("test.png", skinMask); 

    cv::goodFeaturesToTrack(curBwFrame, features, 5, 0.2, 0.5, skinMask); 
    assert(features.size() > 0); 

    return 0; 
} 
+1

Các khẳng định kiểm tra rằng lý lẽ đầu vào là một vectơ của các điểm. Và thật khó để trả lời câu hỏi của bạn mà không có mã của bạn. –

+0

Tôi đã thêm thông tin ở trên, nhưng tôi không chắc chắn những thông tin khác có thể có liên quan. Tôi có thể đổ một số đoạn mã lớn ở đây nhưng chúng có thể chứa rất nhiều thông tin không liên quan. – Pieter

+0

Xin lỗi về việc tôi trộn một số cuộc gọi chức năng trước đó. Tôi đã thêm đoạn mã chính xác ở trên! Tôi cũng có thể đăng mặt nạ và hình ảnh nguồn cho 'goodFeaturesToTrack' nếu cần. – Pieter

Trả lời

4

Vấn đề chính là parameters.In của bạn (thay đổi không tương thích giữa 2.3.1) OpenCV 2.3.2 documentation này là mô tả của các thông số phương pháp:

void goodFeaturesToTrack(InputArray image, OutputArray corners, int maxCorners, double qualityLevel, double minDistance, InputArray mask=noArray(), int blockSize=3, bool useHarrisDetector=false, double k=0.04) 

Tham số:

  • ảnh - Input Hình ảnh đơn kênh 32-bit hoặc điểm nổi 32-bit.
  • góc - Vectơ đầu ra của các góc được phát hiện.
  • maxCorners - Số góc tối đa cần trả lại. Nếu có nhiều hơn góc hơn số được tìm thấy, số điểm mạnh nhất trong số đó được trả về.
  • qualityLevel - Tham số mô tả chất lượng được chấp nhận tối thiểu của góc hình ảnh.Giá trị tham số được nhân với số đo chất lượng góc tốt nhất, là giá trị riêng nhỏ nhất (xem cornerMinEigenVal()) hoặc đáp ứng hàm Harris (xem cornerHarris()). Các góc có thước đo chất lượng nhỏ hơn sản phẩm bị từ chối. Ví dụ: nếu góc tốt nhất có chất lượng là đo = 1500 và chất lượngLấp = 0,01, thì tất cả các góc với thì chất lượng đo lường dưới 15 bị từ chối.
  • minDistance - Khoảng cách Euclide tối thiểu có thể có giữa các góc trả về .
  • mặt nạ - Khu vực ưa thích tùy chọn. Nếu hình ảnh không trống (nó cần phải có loại CV_8UC1 và kích thước tương tự như hình ảnh), nó chỉ định khu vực trong đó các góc được phát hiện.
  • blockSize - Kích thước của một khối trung bình để tính toán một dẫn xuất ma trận covariation trên mỗi vùng lân cận pixel. Xem cornerEigenValsAndVecs().
  • useHarrisDetector - Tham số cho biết có sử dụng thiết bị phát hiện Harris (xem cornerHarris()) hoặc cornerMinEigenVal() hay không.
  • k - Thông số miễn phí của thiết bị dò hạt Harris.

Tôi khuyên bạn nên chơi một chút với qualityLevel và minDistance để đáp ứng nhu cầu của bạn.

+0

Với qualityLevel = 0.1 Tôi đã có thể phát hiện 5 tính năng. –

+0

Giá trị 0.1 ảnh hưởng đến biên độ lỗi như thế nào? Tôi biết rằng nó sẽ tăng lên, nhưng đây có phải là một giá trị chất lượng thường được sử dụng hay nó được coi là không đáng tin cậy? – Pieter

+0

Ý của bạn là gì? goodFeaturesToTrack hoạt động trên phân loại "cấp" của từng pixel trên cửa sổ có kích thước blockSize.Điểm "lớn nhất" này, nhiều khả năng pixel này là một tính năng có thể phân biệt chính xác, có nghĩa là nếu tính năng đó được nhìn thấy trong các điều kiện khác, như ánh sáng môi trường xung quanh hoặc tư thế máy ảnh khác nhau, nó vẫn được phân loại là tính năng tương tự. Nếu pixel không có điểm đủ lớn, điểm ảnh không được phân loại là đối tượng địa lý. Các qualityLevel nhỏ hơn, nhỏ hơn "lớp" cần thiết để phân loại một pixel như là một tính năng, làm cho các tính năng trích xuất ít khác nhau. –

1

Bạn đã thử goodFeaturesToTrack không có mặt nạ để xem có phát hiện các tính năng bên trong vùng bị che khuất không? Có thể, bởi vì hình ảnh tối, và khu vực là một chút textureless, goodFeaturesToTrack không tìm thấy các tính năng ở đó.

Bạn cũng có thể thử ORB or FAST thay vì goodFeaturesToTrack. Tôi đã sử dụng thành công ORB với calcOpticalFlowPyrLK (nhưng không cố gắng sử dụng mặt nạ).

Hoặc bạn có thể cố làm sáng hình ảnh hoặc thậm chí tăng độ tương phản. Không thực sự chắc chắn nếu điều này mang lại cải tiến bởi vì tôi nghĩ rằng vấn đề lớn nhất của kịch bản của bạn là các đối tượng trong cảnh không có đủ kết cấu hoặc góc, đó là những tính năng phù hợp hơn cho các máy dò này. Tôi khuyên bạn nên thử ORB và xem bạn có nhận được nhiều điểm hơn không.

+0

Khi vùng mặt nạ bị bỏ qua, nó chọn các pixel sau: (864, 1170) và (859, 1149). Cả hai điểm này đều không nằm trong vùng mặt nạ. Tôi không quen với ORB và FAST. Tôi có thể tìm thêm thông tin về các kỹ thuật này ở đâu? Tôi không [tìm thấy] (https://encrypted.google.com/search?hl=vi&q=site%3Aopencv.willowgarage.com%20orb%20fast%20goodfeaturestotrack) thông tin trong tài liệu của họ. – Pieter

+0

Nếu nó chỉ phát hiện những điểm mà không có mặt nạ, nó rất có thể xác nhận những gì tôi đã giải thích trong câu trả lời. Tôi sẽ cập nhật nó với thông tin thêm. –

0

Hình ảnh có bắt đầu màu không? Sử dụng cv :: transform để tăng độ tương phản màu trước khi chuyển sang màu xám. Chụp toàn bộ màu xám, từ 0 đến 255. Đừng lo lắng về việc bão hòa hình ảnh bên ngoài mặt nạ.

0

Nếu mã của bạn là tương tự như:

Imgproc.goodFeaturesToTrack(mCurrentFrame, initial, NUMBER_OF_FEATURES, 0.1, 10); 
//The OpenCV opticalFlow will crash if the feature vector does not include any elements 
if (initial.elemSize() == 0) { 
    return; 
} 
initial.convertTo(mPrevPts, CvType.CV_32FC2); 

Video.calcOpticalFlowPyrLK(mPreviousFrame, mCurrentFrame, mPrevPts, mNextPts, status,err); 

Hãy chắc chắn rằng bạn đừng quên báo cáo kết quả kiểm tra kích thước của vector đặc trưng (initial.elemSize() == 0).

Nếu vector này là trống rỗng, việc chuyển đổi từ một ma trận điểm đến các điểm nổi thực hiện bởi các initial.convertTo() dòng sẽ không xảy ra và khẳng định sẽ hiển thị khi gọi calOpticalFlowPyrLK

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