C++ 在OpenCV中对YCbCr图像进行奇异值分解
我正在尝试将图像水印到视频序列中。这个过程需要将帧分解为SVD,我正试图使用下面的部分代码实现这一点。第47行的SVD构造函数因分段错误而失败。 gdb报告以下错误: '程序收到信号SIGSEGV,分段故障。 0xb5d31ada位于/usr/lib/liblapack.so.3gf中的dlange_u2;()中C++ 在OpenCV中对YCbCr图像进行奇异值分解,c++,opencv,svd,C++,Opencv,Svd,我正在尝试将图像水印到视频序列中。这个过程需要将帧分解为SVD,我正试图使用下面的部分代码实现这一点。第47行的SVD构造函数因分段错误而失败。 gdb报告以下错误: '程序收到信号SIGSEGV,分段故障。 0xb5d31ada位于/usr/lib/liblapack.so.3gf中的dlange_u2;()中 #包括 #包括 #包括“cv.h” #包括“highgui.h” 常量无符号整数最大值=10000; 使用名称空间cv; 使用名称空间std; int无_帧; bool check_e
#包括
#包括
#包括“cv.h”
#包括“highgui.h”
常量无符号整数最大值=10000;
使用名称空间cv;
使用名称空间std;
int无_帧;
bool check_exit()
{
返回(waitKey(27)>0)?真:假;
}
int main(int argc,字符**argv)
{
Mat rgb[MAX];
Mat ycbcr[MAX];
Mat wm_rgb[MAX];
namedWindow(“水印”,1);
namedWindow(“RGB”,1);
命名为“YCBCR”,1;
视频捕获(argv[1]);
Mat水印=imread(argv[2]);
int i=0;
捕获>>rgb[i];
imshow(“水印”,水印);
而(!rgb[i].empty())
{
imshow(“RGB”,RGB[i]);
cvtColor(rgb[i]、ycbcr[i]、CV_RGB2YCrCb);
imshow(“YCBCR”,YCBCR[i]);
i++;
捕获>>rgb[i];
CUT对C接口更熟悉,我只想描述一下C++代码中不合适的地方:
SVD()函数要求输入图像为浮点图像,因此您可能需要将标准8位转换为32位。以下是一些非常基本(但不是非常有效)的代码,用于说明:
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在A中转换为32位。我们使用CV\u SVD\u MODIFY\u A
标志使其更快,并在A中修改值。其他选项保留为空(NULL),但您可以根据需要提供参数。请检查OpenCV文档中的参数
希望你能从这个工作代码中找出C++代码中的错误。
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);