Использование переназначения openCV с помощью float *

В настоящее время я работаю над проектом, который предусматривает компенсацию движения.

На данный момент у меня есть входное изображение в cv :: Mat input;

cv::resize( input, input_resized, cvSize(64,48), 12, 12, CV_INTER_AREA);
input_resized.convertTo(input_float, CV_32F); //this might be redundant while cv::rezise dst should be 32F.

Теперь векторы движения сохраняются в двухканальном движении cv :: Mat и хранятся так:

// w -image.width , h-image.height
X0  Y0  X1   Y1   X2   Y2   ...  Xw-1  Yw-1
Xw  Yw  Xw+1 Yw+1 Xw+2 Yw+2 ...  X2w-1 Y2w-1
...
X(h-1)w Y(h-1)w   ............. X(h-1)(w-1)Y(h-1)(w-1)

Так что, если я использую:

std::vector<cv::Mat> motionvect(2);
cv::split(motion, motionvect);

Я получу X в motionvect (0) и Y в motionvect2 (1).

Кроме того, я попробовал:

std::vector<cv::Mat> rgbChannels(3);
cv::split(input_float, rgbChannels);
cv::remap(rgbChannels[0], outChannels[0], motionvect[0], motionvect[1], CV_INTER_LINEAR, IPL_BORDER_CONSTANT, cvScalar(0,0, 0));
cv::remap(rgbChannels[1], outChannels[1], motionvect[0], motionvect[1], CV_INTER_LINEAR, IPL_BORDER_CONSTANT, cvScalar(0,0, 0));
cv::remap(rgbChannels[2], outChannels[2], motionvect[0], motionvect[1], CV_INTER_LINEAR, IPL_BORDER_CONSTANT, cvScalar(0,0, 0));

cv::merge(outChannels, input_with_motion);

Результаты, которые я получаю после этого, очень странные, и кто-то сказал мне, что это из-за вектора Y.
По-видимому, если X так:

1  2  3  4  5
6  7  8  9  10
11 12 13 14 15

Тогда Y должно быть:

1  6  11
2  7  12
3  8  13
4  9  14
5  10 15

Это верно? Сортировка транспонированной матрицы. Если это правда, есть ли какая-нибудь функция, которая изменит motiovect [2], чтобы он выглядел так или я должен делать это для каждого отдельного компонента?

Кроме того, для последнего шага мне нужно будет применить переназначение в другое время в моем процессе. Что-то вроде этого:

Function1 ( (float*) input_float.data , (float*) motion.data, (unsigned char*) out.data );
Function2 ( float* input, float* R, float* G, float* B);
Function3 ( float* R, float* G, float* B, float* W, float* Z);

где R, G, B, W, Z являются типами с плавающей точкой *, и они имеют

 R = (float*) malloc (frame_size * sizeof(float) );

Мне нужно применить компенсацию движения для float * A и float * B, но эти входы не допускаются для повторного отображения. Они должны быть InputArray, и я не могу найти какой-либо метод для преобразования float * в любой принятый тип InputArray.

Я знаю, что я не очень организован в мыслях, но я надеюсь, что вы поймете хотя бы один из моих вопросов.
1. Как применить переназначение, если у меня есть векторы движения, хранящиеся в cv :: Mat, такие как x0 y0 x1 y1 ..?
2. Могу ли я преобразовать float * в принятый ввод для cv :: remap?

1

Решение

Для вашего # 2 вы можете сделать это, чтобы получить значения с плавающей точкой из указателя в некоторый Mat:

cv::Mat testMat = cv::Mat::zeros(2, 3, CV_32F);
std::cout << "(1, 2) elem = " << testMat.at<float>(1, 2) << std::endl;

float* pTestVal = new float;
*pTestVal = 3.14F;
testMat.at<float>(1, 2) = *pTestVal;
delete pTestVal;

std::cout << "(1, 2) elem = " << testMat.at<float>(1, 2) << std::endl;
0

Другие решения

Я нашел этот урок http://docs.opencv.org/doc/tutorials/imgproc/imgtrans/remap/remap.html очень полезно для понимания того, как установить параметры map1, map2. В конце концов это примерно так:

for(int i=0; i< rows; i++){
for(int j=0; j<col; j++)
{
map_x.at<float>(i,j) = j + motion_vect.ptr<float>(i)[2*j+0];
map_y.at<float>(i,j) = i + motion_vect.ptr<float>(i)[2*j+1];;
}}

Чтобы изображение на выходе было оригинальным:

map_x.at<float>(i,j) = j ;
map_y.at<float>(i,j) = i ;
2

По вопросам рекламы [email protected]