Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/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
Python 为什么cvSet2D接受一个双元组,为什么第一个元素的元组都保存为0?_Python_C_Image Processing_Opencv - Fatal编程技术网

Python 为什么cvSet2D接受一个双元组,为什么第一个元素的元组都保存为0?

Python 为什么cvSet2D接受一个双元组,为什么第一个元素的元组都保存为0?,python,c,image-processing,opencv,Python,C,Image Processing,Opencv,cvSet2D(矩阵,i,j,元组) 嗨。我正在剖析中给出的Gabor滤波器代码。我对cvSet2D有一些问题,特别是在以下代码段中使用的cvSet2D(如链接中所示): C代码: for (x = -kernel_size/2;x<=kernel_size/2; x++) { for (y = -kernel_size/2;y<=kernel_size/2; y++) { kernel_val = exp( -((x*x)+(y*y))/(2*var))*cos( w*

cvSet2D(矩阵,i,j,元组)

嗨。我正在剖析中给出的Gabor滤波器代码。我对cvSet2D有一些问题,特别是在以下代码段中使用的cvSet2D(如链接中所示):

C代码:

for (x = -kernel_size/2;x<=kernel_size/2; x++) {
  for (y = -kernel_size/2;y<=kernel_size/2; y++) {
    kernel_val = exp( -((x*x)+(y*y))/(2*var))*cos( w*x*cos(phase)+w*y*sin(phase)+psi);
    cvSet2D(kernel,y+kernel_size/2,x+kernel_size/2,cvScalar(kernel_val));
    cvSet2D(kernelimg,y+kernel_size/2,x+kernel_size/2,cvScalar(kernel_val/2+0.5));
  }
}
据我所知,cvSet2D将矩阵的第(j,I)个像素设置为上一个参数中定义的元组的等效颜色值。但是为什么它需要一个双倍元组呢?看到像素颜色被定义为整数的元组,接受整数的元组不是更自然吗

最后,如果我正确阅读了文档,那么使用的cvScalar方法将返回4元组
。我推测cvSet2D取前三个值并将其用作RGB 3元组。但是,看到Gabor滤波器的输出或多或少是灰度的,那就不成立了,在我的方案中产生的颜色将倾向于红色。那么,cvSet2D如何处理这个元组呢


谢谢你愿意费心解释的人

我认为对于灰度图像(矩阵),CvSet2D使用cvScalar中的第一个值设置唯一通道(亮度)。CvSet2D的文档似乎已损坏,我将尝试在代码中进行验证

编辑:在链接到的代码示例中,
内核
的类型为CV_32FC1,这意味着它只有一个通道。
kernelImg
也是如此:

kernel = cvCreateMat(kernel_size,kernel_size,CV_32FC1)
kernelimg = cvCreateImage(cvSize(kernel_size,kernel_size),IPL_DEPTH_32F,1)

因此,标量只需要在其中设置一个通道值是有意义的。

在OpenCV中,图像可以有1个(灰度)、2个、3个(RGB)或4个(RGB加alpha)通道。无论有多少通道,one
Set2D
功能用于所有图像。该元组的每个元素都用于指定通道值

您总是通过元组传递四个值,但OpenCV将只使用其中的第一个
N
,其中
N
是图像中的通道数。它将忽略其余部分。零只是一个公认的占位符,意思是“这个值不重要”。当然,您可以传递任何想要的值,但是代码的可读性会受到影响

之所以使用double作为参数类型,可能是因为它是Python中可以使用的最高精度类型。OpenCV将把这个值转换为正确的底层类型(它从图像中获取)


由于您处理的是单通道32位浮点图像(
CV_32FC1
),只需继续使用
Set2D(image,(value,0,0,0))
,一切都会好起来。

多亏了你们两位。但还要感谢@misha提供的额外细节。
kernel = cvCreateMat(kernel_size,kernel_size,CV_32FC1)
kernelimg = cvCreateImage(cvSize(kernel_size,kernel_size),IPL_DEPTH_32F,1)