我目前正在开展涉及运动补偿的项目。
此时我在cv :: Mat输入中有输入图像;
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.
现在运动矢量存储在2通道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);
我将在Motionvect(0)中获得X,在motionvect2(1)中获得Y.
此外我尝试过:
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是float *类型,它们用
分配 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的接受输入吗?
答案 0 :(得分:2)
我发现本教程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 ;
答案 1 :(得分:0)
对于你的#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;