Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在OpenCV中对YCbCr图像进行奇异值分解_C++_Opencv_Svd - Fatal编程技术网

C++ 在OpenCV中对YCbCr图像进行奇异值分解

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

我正在尝试将图像水印到视频序列中。这个过程需要将帧分解为SVD,我正试图使用下面的部分代码实现这一点。第47行的SVD构造函数因分段错误而失败。 gdb报告以下错误:

'程序收到信号SIGSEGV,分段故障。 0xb5d31ada位于/usr/lib/liblapack.so.3gf中的dlange_u2;()中

#包括
#包括
#包括“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);