2012-04-08 7 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() 함수는 입력 이미지가 부동 소수점 이미지이기를 기대하므로 32로 스케일을 변환해야 할 수도 있습니다 표준 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)에 저장된다. 입력 이미지 imgA에서 32 비트로 변환됩니다. CV_SVD_MODIFY_A 플래그를 사용하여 더 빠르게 만들고 값을 으로 수정했습니다. 다른 옵션은 공백 (NULL)이지만, 필요에 따라 매개 변수를 제공 할 수 있습니다. OpenCV 문서를 확인하십시오.

이 작업 코드에서 C++ 코드의 잘못된 점을 파악할 수 있기를 바랍니다.