2012-04-08 4 views
1

イメージをビデオシーケンスに透かし入れようとしています。このプロセスでは、以下の部分コードを使用して達成しようとしているSVDへのフレームの分解が必要です。 47行目のSVDコンストラクタがセグメンテーション違反で失敗します。 gdbが次のエラーを報告します。OpenCVのYCbCrイメージにSVDを適用する

に慣れビーイング

#include <iostream> 
#include <stdio.h> 
#include "cv.h" 
#include "highgui.h" 
const unsigned int MAX = 10000; 

using namespace cv; 
using namespace std; 

int NO_FRAMES; 

bool check_exit() 
{ 
return (waitKey(27) > 0)?true:false; 
} 

int main(int argc, char ** argv) 
{ 
Mat rgb[MAX]; 
Mat ycbcr[MAX]; 
Mat wm_rgb[MAX]; 
namedWindow("watermark",1); 
namedWindow("RGB", 1); 
namedWindow("YCBCR",1); 
VideoCapture capture(argv[1]); 
Mat watermark = imread(argv[2]); 
int i=0; 
     capture >> rgb[i]; 
imshow("watermark", watermark); 
while(!rgb[i].empty()) 
{ 
imshow("RGB", rgb[i]); 
cvtColor(rgb[i], ycbcr[i], CV_RGB2YCrCb); 
imshow("YCBCR", ycbcr[i]); 
i++; 
capture >> rgb[i]; 

cout<<"frame "<<i<<endl; 
if(check_exit()) 
exit(0); 
} 
//This line creates Segmentation fault 
SVD temp(rgb[0]); 
capture.release(); 
return 0; 
} 

答えて

0

"プログラムが/usr/lib/liblapack.so.3gfからの信号SIGSEGV、dlange_(でセグメンテーションフォールト 0xb5d31ada)を受けた。" Cのインターフェイスでは、あなたのC++コードでは見えないいくつかのことを説明します:

SVD()関数は、入力画像が浮動小数点画像であると予想しているので、標準8ビットからのビット。ここで例示の目的のためにいくつかの非常に基本的な(かつ非常に効率的ではない)のコードは次のとおり

int N = img->width; 
IplImage* W = cvCreateImage(cvSize(N, 1), IPL_DEPTH_32F , 1); 
IplImage* A = cvCreateImage(cvGetSize(img), IPL_DEPTH_32F , 1); 
cvConvertScale(img, A); 

IplImage* W_mod = cvCreateImage(cvSize(N-l, 1), IPL_DEPTH_32F , 1); 
cvSVD(A, W, NULL, NULL, CV_SVD_MODIFY_A); 

SVD値は W 名前Nx1の行列(この場合はIplImageへ)に格納されています。入力画像imgは、で32ビットに変換されます。 CV_SVD_MODIFY_Aフラグを使用してより速くし、値をAに変更しました。他のオプションは空白(NULL)のままですが、必要に応じてパラメータを指定できます。 OpenCVのドキュメントをチェックしてください。

この作業コードから、C++コードの何が間違っていたかを知ることができたら幸いです。