2012-05-15 84 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)來正確組織矩陣 –