2012-04-08 2 views
1

Я пытаюсь сделать водяной знак изображения в видеопоследовательность. Процесс требует декомпозиции кадров в SVD, который я пытаюсь достичь, используя неполный код ниже. Конструктор SVD в строке 47 не работает с ошибкой сегментации. GDB сообщает следующее сообщение об ошибке:Применение SVD для изображения YCbCr в OpenCV

"Программа получила сигнал SIGSEGV, сегментация вина 0xb5d31ada в dlange_() из /usr/lib/liblapack.so.3gf."

#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

Будучи более знакомы с 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); 

Значения СВД сохраняются в NX1 матрице (IplImage в данном случае) с именем W. Входное изображение img преобразуется в 32-бит в A. Мы использовали флаг CV_SVD_MODIFY_A, чтобы ускорить его и изменить значения в A. Остальные опции остались пустыми (NULL), но вы можете указать параметры по мере необходимости. Пожалуйста, ознакомьтесь с документами OpenCV для них.

Надеюсь, вы сможете выяснить из этого рабочего кода, что было не так в коде C++.

Смежные вопросы