0

我有个问题。我需要使用 OpenCV Mat 图像结构将多个参数传递给线程。

我有一个这样的结构:

struct Args
{
    Mat in[6];
    Mat out[6];
};

还有一个由线程调用的 void 函数,如下所示:

void grey (void *param){
    while (TRUE)
    {
    WaitForSingleObject(mutex,INFINITE);
    Args* arg = (Args*)param;
    cvtColor(*arg->in,*arg->out,CV_BGR2GRAY);
    ReleaseMutex(mutex);
    _endthread();
    }
}

为了将灰色函数作为具有两个 Mat 数组参数的线程启动,我在 main 中使用以下行:

Args dati;
    *dati.in = *inn;
    *dati.out = *ou;


handle1 = (HANDLE) _beginthread(grey,0,&dati);

现在,我的问题是:我需要访问从线程本身传递给线程的结构中的两个数组“in”和“out”的所有 6 个元素,或者找到一种将数组从 0 转换为 5 的模式以详细说明所有元素“灰色”功能。

我如何从线程或主线程执行此操作?我的意思是使用灰色函数来详细说明我在该模式下传递给线程的结构 Args [6] 中的数组 Mat 的所有 6 个元素。

有人可以帮助我或给我一个想法吗?我不知道该怎么做。

4

2 回答 2

2

在创建线程之前,您可以像这样分配数组:

*dati.in = *inn;
*dati.out = *ou;

这只会分配数组中的第一个条目。阵列的其余部分将保持不变。

您需要将所有源数组复制到目标数组中。您可以std::copy为此使用:

std::copy(std::begin(dati.in), std::end(dati.in), std::begin(inn));

当然,这要求源“数组”至少inn包含与目标数组一样多的项目。

然后在线程中简单地遍历项目:

for (int i = 0; i < 6; i++)
{
    cvtColor(arg->in[i], arg->out[i], CV_BGR2GRAY);
}
于 2013-05-29T09:19:21.383 回答
1

当您启动线程时,此代码:

Args dati;
*dati.in = *inn;
*dati.out = *ou;

只是初始化六个元素之一。如果innou实际上是 6 个元素数组,则需要一个循环来初始化所有 6 个元素。

Args dati;
for (int i = 0; i < 6; i++) {
  dati.in[i] = inn[i];
  dati.out[i] = ou[i];
}

同样,在您的线程中,您只处理数组中的第一个元素。所以这段代码:

Args* arg = (Args*)param;
cvtColor(*arg->in,*arg->out,CV_BGR2GRAY);

需要变成这样:

Args* arg = (Args*)param;
for (int i = 0; i < 6; i++) {
  cvtColor(arg->in[i],arg->out[0],CV_BGR2GRAY);
}
于 2013-05-29T09:19:03.290 回答