2017-01-13 6 views
2

Я пишу программу, использующую OpenCV и Kinect v2 SDK, где я встретил неудобную проблему. Я получил векторы Point2i (класс, состоящий из int X, Y) в качестве индексов пикселей, и мне нужно преобразовать его в depthSpacePoint (структуру, состоящую из float32 X, Y), которая является просто depthSpacePoints.X = Point2i.X; или наоборот.Эффективно конвертировать данные из opencv

Существует так много элементов, что запись цикла for будет слишком медленной.

Так что я задаюсь вопросом, есть ли какой-либо метод, например memcpy или другой, чтобы сделать это быстрее?

Вот краткое моего кода:

cv::findnonZeros(Mat A, vector<cv::Point2i> B); 

vector<depthSpacePoint> C(B.size()); 

for(int i= 0; i < B.size(); ++i){ 
C[i].X = b[i].x; 
C[i].Y = B[i].y; 
} 

icoordinateMapper(C.size(),C,...,...); 

< - это причина, почему я преобразовать его, так как эта функция библиотека принимает только свой собственный тип данных depthSpacePoint;

+0

как вы получаете баллы? возможно, их можно получить как «Point2f»? – slawekwin

+0

Может быть, я могу использовать findNonzeros (Mat, vector ), используя Point2f, может стоить памяти, я думаю, что это компромисс, который я должен принять. – Newb

ответ

1

Вы можете реализовать свою собственную версию cv::findNonZero, которая непосредственно создает std::vector<depthSpacePoint>.

Это всего лишь вопрос сканирования (efficiently) матрицы и проверки состояния.

void findNonZeroSpacePoints(InputArray _src, std::vector<depthSpacePoint>& pts) 
{ 
    // Get the src matrix, be sure it's of correct type 
    Mat src = _src.getMat(); 
    CV_Assert(src.type() == CV_8UC1);   

    // If src is all zero, return 
    int n = countNonZero(src); 
    if(n == 0) { 
     pts.clear(); 
     return; 
    } 

    // Allocate pts 
    pts.resize(n);   

    // Efficiently scan matrix and append points 
    depthSpacePoint* ppts = pts.data(); 
    for(int i = 0; i < src.rows; i++) 
    { 
     const uchar* bin_ptr = src.ptr(i); 
     for(int j = 0; j < src.cols; j++) 
      if(bin_ptr[j]) 
       *ppts ++ = depthSpacePoint(float(j), float(i)); 
    } 
} 
+0

Спасибо, это предлагает новый способ взглянуть на него. Но, по моему опыту findNonZero(), кажется, автоматически выполняет параллельное вычисление, может быть трудно выполнить свою скорость с помощью однопоточных циклов. – Newb

+0

Нет, это не так. Проверьте [осуществление] (https://github.com/opencv/opencv/blob/e6d7989b203b7af02fe49f5c1ecdbcae41744568/modules/core/src/stat.cpp#L4038). Только 'countNonZero' может использовать параллельное вычисление, но так оно и есть в этой функции. – Miki

+0

Моя ошибка, это помогает много, находит еще один способ ускорить работу – Newb

Смежные вопросы