gpt4 book ai didi

c - 如何在 OpenCV 中屏蔽浮点图像?

转载 作者:行者123 更新时间:2023-11-30 15:59:37 25 4
gpt4 key购买 nike

我有一个浮点值的 Nx1 矩阵。我希望仅获取从 22ndNth 项开始的那些值的平均值。我创建了一个 Nx1 尺寸的二进制掩码,将 0s 放在 [0,21]1s 范围内其余的。在计算平均值时应用该掩码(使用内置函数以获得最大速度)会产生错误。代码片段如下。

错误是:

sizes on input arguments do not match in cvSvg()"

正确的 mask 应该是什么?我尝试在掩码中使用浮点而不是整数,但仍然不起作用。

CvMat mask;
int i;
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);
int* vals = (int*)malloc(N*sizeof(int));

for(i=0; i<N; i++)
{
if(i<22)
vals[i] = 0;
else
vals[i] = 1;
}
cvInitMatHeader(&mask, N, 1, CV_8U, vals);

cvSVD(A, W, NULL, NULL, CV_SVD_MODIFY_A);

CvScalar mean = cvAvg(W, &mask);

最佳答案

以下是我如何通过一个人为的示例计算掩码,但它似乎工作得很好。

int main(int argc, char* argv[])
{
int N = 50;
CvMat* a = cvCreateMat(1, N, CV_32FC1);
CvMat* mask = cvCreateMat(1, N, CV_8UC1);

float* aData = a->data.fl;
uchar* maskData = mask->data.ptr;

for(int i = 0; i < a->cols; i++)
{
aData[i] = (float)i;

if(i < 22)
{
maskData[i] = 0;
}
else
{
maskData[i] = 1;
}
}

CvScalar avg = cvAvg(a);
cout << "Average without mask: " << avg.val[0] << endl;

avg = cvAvg(a, mask);
cout << "Average with mask: " << avg.val[0] << endl;

cvReleaseMat(&a);
cvReleaseMat(&mask);
return 0;
}

这会产生以下输出:

Average without mask: 24.5
Average with mask: 35.5

因此,它适用于这个简单的示例。希望这能让你再次前进。

关于c - 如何在 OpenCV 中屏蔽浮点图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8663646/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com