Переведите массив numpy в эквивалент OpenCV

I am having a problem to translate numpy's ndarray functions to their equivalent OpenCV C++ calls to reshape/split a n-dimensional cv::Mat into appropriate slices. In particular i am trying to convert the OpenCV python2 sample "texture_flow.py" (>= OpenCV 2.4.3) to C++. I've marked the lines in question in the snippet below.

# [......]
img = cv2.imread(fn)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# simple width and height tuple
h, w = img.shape[:2]

eigen = cv2.cornerEigenValsAndVecs(gray, 15, 3)
print eigen.shape # prints: (height, widht, 6), i.e. 6 channels

# Problem 1:
# OpenCV's reshape function is not sufficient to do this.
# probably must be split into several steps...
eigen = eigen.reshape(h, w, 3, 2)  # [[e1, e2], v1, v2]
print eigen.shape # prints: (height, width, 3, 2)

# Problem 2:
# I assume this is meant to get the the v1 and v2 matrices 
# from the previous reshape
flow = eigen[:,:,2]
print flow.shape # prints: (height, width, 2), i.e. 2 channels

vis = img.copy()
# C++: vis.data[i] = (uchar)((192 + (int)vis.data[i])/2);
vis[:] = (192 + np.uint32(vis))/2

d = 12

# Problem 3:
# Can probably be split into 2 nested for-loops 
points =  np.dstack( np.mgrid[d/2:w:d, d/2:h:d] ).reshape(-1, 2)

# [......]

Может ли кто-нибудь помочь мне перевести соответствующие строки на C ++?

5
добавлено
Просмотры: 2
nl ja de

1 ответы

После тщательного размышления об этом все было легче, чем ожидалось. Это только смешной синтаксис массива nump, который меня сбивает с толку. Реорганизация массивов numpy - это просто способ python для доступа к одиночным каналам результирующего cv :: Mat "anigen". Следующий код - это версия C ++ «texture_flow.py» на C ++ (взята из OpenCV 2.4.3). Результирующее изображение потока не на 100% идентично версии python, но оно достаточно близко.

#include 
#include 

int main (int argc, char** argv)
{
    cv::TickMeter tm;
    tm.start();
    cv::Mat img = cv::imread(argv[1]);
    cv::Mat gray = cv::Mat();
    cv::cvtColor(img, gray, CV_BGR2GRAY);
   //to preserve the original image
    cv::Mat flow = gray.clone();
    int width = img.cols;
    int height = img.rows;
    int graySize = width * height;
   //"brighten" the flow image 
   //C++ version of:
   //vis[:] = (192 + np.uint32(vis))/2
    for (unsigned int i=0; i channels;
    cv::split(eigen, channels);

    int d = 12;
    cv::Scalar col(0, 0, 0);
   //C++ version of:
   //points =  np.dstack( np.mgrid[d/2:w:d, d/2:h:d] ).reshape(-1, 2)
   //including the actual line drawing part
    for (unsigned int y=(d/2); y< flow.cols && y < flow.rows)
             {
                 cv::Point p(x, y);
                 float dx = channels[4].at(p) * (d/2);
                 float dy = channels[5].at(p) * (d/2);
                 cv::Point p0(p.x - dx, p.y - dy);
                 cv::Point p1(p.x + dx, p.y + dy);
                 cv::line(flow, p0, p1, col, 1);
              }
         }
    }
    tm.stop();
    std::cout<<"Flow image generated in "<<<" ms."<
2
добавлено