2013-01-11 42 views
6

Tôi có ma trận mô tả từ việc trích xuất mô tả FREAK trong đó mỗi hàng là bộ mô tả 64 phần tử.Chuyển đổi hàng cv :: Mat thành int

Tôi cần tạo vector <int*> từ ma trận này do yêu cầu hệ thống. Tôi đã thử điều này cho đến thời điểm này:

Mat _descriptors; 
std::vector<int*> descriptors; 
int row; 
for (int i=0; i<_descriptors.rows;i++) 
{ 
    row =(int) _descriptors.row(i).data; 
    descriptors.push_back(& row); 
} 

Đây có phải là cách chính xác hay không?

Trả lời

4

Tất cả các giá trị trong descriptors sẽ trỏ đến biến row trên ngăn xếp bằng mã này.

Nhìn vào định nghĩa của một opencv Mat, row lợi nhuận theo giá trị:

// returns a new matrix header for the specified row 
Mat row(int y) const; 

Truy cập dữ liệu trong _descriptors trực tiếp và đẩy mạnh với biến cung cấp thành viên sải chân step nên làm việc tuy nhiên:

Mat _descriptors; 
std::vector<int*> descriptors; 
for (int i=0; i<_descriptors.rows;i++) 
{ 
    descriptors.push_back((int*)(_descriptors.data + i * _descriptors.step)); 
} 
+0

ok, tôi đã nghi ngờ mình đã làm điều gì đó sai, cảm ơn –

+1

Dù sao mã của bạn đã thắng Không biên dịch, tôi đã thay đổi static_cast <> bằng cách này: (int *) –

+0

Cảm ơn, sẽ cập nhật câu trả lời của tôi –

0

Khi bạn đang tạo đối tượng mới cho véc tơ descriptors, bạn đang tạo một đối tượng có địa chỉ của biến số row và không phải là giá trị thực. Để lưu trữ giá trị, nếu đó là những gì bạn muốn, mã sẽ giống như thế này.

Mat _descriptors; 
std::vector<int> descriptors; 
int row; 
for (int i=0; i<_descriptors.rows;i++) 
{ 
    row =(int) _descriptors.row(i).data; 
    descriptors.push_back(row); 
} 

Tôi cũng thay đổi vector<int*> descriptors thành vector<int> descriptors.

+0

Vâng , đây không phải là những gì tôi muốn, tôi cần một vector như một chức năng khác yêu cầu nó, và nó không phải là vào tôi để thay đổi nó. –

+0

Ok, vì vậy bạn nên sử dụng 'vector mô tả' và khi tạo đối tượng chỉ cần gọi' descriptors.push_back (int mới (hàng)); ' –

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