2012-05-15 50 views
0

我正在使用光谱相机,并使用opencv来处理。我刚开始使用opencv,所以这可能不是最好的方式来做到这一点。opencv六通道矩阵乘法

基本上这段代码从两个视频流中获取帧,然后进行矩阵乘法。 captureF和captureM都是视频流,eigen是6x7矩阵,最后一行是需要从图像中减去的偏移量。

我无法弄清楚如何将两帧合并成一个六声道的图像,看着合并和混音通道,但无法正常工作),所以我最后手动完成矩阵乘法并将数据保存到两个三通道图像,但理想情况下这将是一个6通道矩阵。我的问题是,这段代码目前运行速度很慢(每帧20秒),我想知道是否有办法做到这一点,运行速度更快,或使用6通道图像做到这一点?

 IplImage imgF = cvQueryFrame(captureF); 
     IplImage dst2 = cvQueryFrame(captureM); 


     IplImage *OutImg1 = cvCreateImage(cvSize(imgF->width, imgF->height), IPL_DEPTH_32F, 3); 
     IplImage *OutImg2 = cvCreateImage(cvSize(imgF->width, imgF->height), IPL_DEPTH_32F, 3); 

     // iterates through each frame in the image. 
     for(int i=0; i<(imgF->imageSize)/3;i+=3){ 
       ((float*)OutImg1->imageData)[i] = cvmGet(eigen,0,2)*(imgF->imageData[i]-cvmGet(eigen,6,2)) + cvmGet(eigen,0,1)*(imgF->imageData[i+1]-cvmGet(eigen,6,1)) + cvmGet(eigen,0,0)*(imgF->imageData[i+2]-cvmGet(eigen,6,0)) + cvmGet(eigen,0,5)*(dst2->imageData[i]-cvmGet(eigen,6,5)) + cvmGet(eigen,0,4)*(dst2->imageData[i+1]-cvmGet(eigen,6,4)) + cvmGet(eigen,0,3)*(dst2->imageData[i+2]-cvmGet(eigen,6,3)); 
       ((float*)OutImg1->imageData)[i+1] = cvmGet(eigen,1,2)*(imgF->imageData[i]-cvmGet(eigen,6,2)) + cvmGet(eigen,1,1)*(imgF->imageData[i+1]-cvmGet(eigen,6,1)) + cvmGet(eigen,1,0)*(imgF->imageData[i+2]-cvmGet(eigen,6,0)) + cvmGet(eigen,1,5)*(dst2->imageData[i]-cvmGet(eigen,6,5)) + cvmGet(eigen,1,4)*(dst2->imageData[i+1]-cvmGet(eigen,0,4)) + cvmGet(eigen,1,3)*(dst2->imageData[i+2]-cvmGet(eigen,6,3)); 
       ((float*)OutImg1->imageData)[i+2] = cvmGet(eigen,2,2)*(imgF->imageData[i]-cvmGet(eigen,6,2)) + cvmGet(eigen,2,1)*(imgF->imageData[i+1]-cvmGet(eigen,6,1)) + cvmGet(eigen,2,0)*(imgF->imageData[i+2]-cvmGet(eigen,6,0)) + cvmGet(eigen,2,5)*(dst2->imageData[i]-cvmGet(eigen,6,5)) + cvmGet(eigen,2,4)*(dst2->imageData[i+1]-cvmGet(eigen,0,4)) + cvmGet(eigen,2,3)*(dst2->imageData[i+2]-cvmGet(eigen,6,3)); 

       ((float*)OutImg2->imageData)[i] = cvmGet(eigen,3,2)*(imgF->imageData[i]-cvmGet(eigen,6,2)) + cvmGet(eigen,3,1)*(imgF->imageData[i+1]-cvmGet(eigen,6,1)) + cvmGet(eigen,3,0)*(imgF->imageData[i+2]-cvmGet(eigen,6,0)) + cvmGet(eigen,3,5)*(dst2->imageData[i]-cvmGet(eigen,6,5)) + cvmGet(eigen,3,4)*(dst2->imageData[i+1]-cvmGet(eigen,0,4)) + cvmGet(eigen,3,3)*(dst2->imageData[i+2]-cvmGet(eigen,6,3)); 
       ((float*)OutImg2->imageData)[i+1] = cvmGet(eigen,4,2)*(imgF->imageData[i]-cvmGet(eigen,6,2)) + cvmGet(eigen,4,1)*(imgF->imageData[i+1]-cvmGet(eigen,6,1)) + cvmGet(eigen,4,0)*(imgF->imageData[i+2]-cvmGet(eigen,6,0)) + cvmGet(eigen,4,5)*(dst2->imageData[i]-cvmGet(eigen,6,5)) + cvmGet(eigen,4,4)*(dst2->imageData[i+1]-cvmGet(eigen,0,4)) + cvmGet(eigen,4,3)*(dst2->imageData[i+2]-cvmGet(eigen,6,3)); 
       ((float*)OutImg2->imageData)[i+2] = cvmGet(eigen,5,2)*(imgF->imageData[i]-cvmGet(eigen,6,2)) + cvmGet(eigen,5,1)*(imgF->imageData[i+1]-cvmGet(eigen,6,1)) + cvmGet(eigen,5,0)*(imgF->imageData[i+2]-cvmGet(eigen,6,0)) + cvmGet(eigen,5,5)*(dst2->imageData[i]-cvmGet(eigen,6,5)) + cvmGet(eigen,5,4)*(dst2->imageData[i+1]-cvmGet(eigen,0,4)) + cvmGet(eigen,5,3)*(dst2->imageData[i+2]-cvmGet(eigen,6,3)); 
     } 
+0

光谱相机听起来很酷。 –

回答

0

我用opencv2,并且是一个新手等级,所以也许有更好的方法。我想如果你需要的话,你可以转换到旧的cv。 首先,它看起来很烦人,不存在6个通道的标量。因此,将您的数据转换为NX6阵列(N = rows * cols),并使用矩阵乘法。

Mat twoIm[2]; 
Mat eigen(6,6,CV_32F); 
Mat bigGuy,newGuy; 

merge(twoIm,2,bigGuy);   // load your two images into twoIm[0] & twoIm[1] 
bigGuy.convertTo(bigGuy, CV_32F); // mat multiply wants everything the same type 

Mat bigGal = bigGuy.reshape(1, 6); // this makes 6 channels into 6 rows 

newGuy = bigGal.t() * eigen;  // and voila! 
+0

当然,您可能想要添加偏移矢量,并将newGuy重新设置回6个通道。 –

+0

而且我不太确定那是不是应该用N = cols *行重塑(1,N)。 –

+1

这是事实上重塑(1,N)来正确组织矩阵 –