Assertion failed (!fixedSize() || ((Mat*)obj)->size.operator()() == _sz) in cv::_OutputArray::create,
时间: 2024-04-25 20:25:23 浏览: 201
这是一个 OpenCV 库中的错误断言。通常,它表示创建的 cv::Mat 对象的尺寸与期望的尺寸不匹配。这个错误可能是由于以下几种情况引起的:
1. 分配给 cv::Mat 对象的数据不符合指定的尺寸。
2. 当尝试创建一个固定大小的 cv::Mat 对象时,指定的尺寸与实际分配的尺寸不匹配。
3. 传递给函数的输出参数(cv::Mat类型)已经被分配过,但尺寸与所需尺寸不匹配。
要解决这个问题,你可以做以下几步:
1. 确保为 cv::Mat 对象分配的数据与指定的尺寸相匹配。
2. 如果你正在创建一个固定大小的 cv::Mat 对象,请确保指定的尺寸与实际分配的尺寸相匹配。
3. 如果你正在使用一个输出参数作为 cv::Mat 对象,请确保它没有被先前的操作分配,并且尺寸与所需尺寸相匹配。
如果问题仍然存在,可能需要进一步检查代码以找出导致错误的具体原因。
相关问题
已知:输入图片都是640*480分辨率,出现了“OpenCV(4.6.0) Error: Assertion failed (!fixedSize() || ((Mat*)obj)->size.operator()() == Size(_cols, _rows)) in cv::debug_build_guard::_OutputArray::create, file c:\build\master_winpack-build-win64-vc15\opencv\modules\core\src\matrix_wrap.cpp, line 1219”报错
这个错误通常是因为你的代码中使用了固定大小的矩阵,而你的输入图片不符合该大小。你可以尝试使用`cv::resize`函数将输入图片的大小调整为你需要的大小,以解决这个问题。具体来说,你可以使用以下代码:
```
cv::Mat input_image = cv::imread("your_image_path");
cv::Mat resized_image;
cv::resize(input_image, resized_image, cv::Size(固定宽度, 固定高度));
```
其中,`固定宽度`和`固定高度`分别为你需要的矩阵的宽度和高度。然后,你可以将`resized_image`作为输入传递给你的函数。
仔细分析这一段 /* initialize touch number and corrdinate */ *(p_instance_ctrl->pinfo.p_num_touch) = 0; *(p_instance_ctrl->pinfo.p_rx_coordinate) = TOUCH_OFF_VALUE; *(p_instance_ctrl->pinfo.p_tx_coordinate) = TOUCH_OFF_VALUE; /* Get local variable (TS number & data pinch) */ num_x = p_instance_ctrl->p_touch_cfg->p_ctsu_instance->p_cfg->num_rx; TOUCH_ERROR_RETURN(0 != num_x, FSP_ERR_ASSERTION); num_y = p_instance_ctrl->p_touch_cfg->p_ctsu_instance->p_cfg->num_tx; TOUCH_ERROR_RETURN(0 != num_y, FSP_ERR_ASSERTION); element_num = (uint16_t) (num_x * num_y); /* Data get */ err = p_instance_ctrl->p_ctsu_instance->p_api->dataGet(p_instance_ctrl->p_ctsu_instance->p_ctrl, g_touch_pad_buf); FSP_ERROR_RETURN(FSP_ERR_CTSU_SCANNING != err, FSP_ERR_CTSU_SCANNING); /* check for max touch */ if (*(p_instance_ctrl->pinfo.p_max_touch) > TOUCH_PAD_MONITOR_TOUCH_NUM_MAX) { max_touch = TOUCH_PAD_MONITOR_TOUCH_NUM_MAX; } else { max_touch = *(p_instance_ctrl->pinfo.p_max_touch); } /* make difference value = secondary - primary */ for (i = 0; i < element_num; i++) { /* save to buffer in the first half */ g_touch_pad_buf[i] = (uint16_t) (g_touch_pad_buf[(i * 2) + 1] - g_touch_pad_buf[i * 2]); }
这段代码是在初始化触摸板相关的变量和获取触摸数据。首先,它将触摸数和坐标值初始化为0和TOUCH_OFF_VALUE。然后,它从触摸板配置结构体中获取接收和发送通道的数量,并计算出元素数量。接下来,它调用dataGet函数来获取触摸数据,并将数据存储在g_touch_pad_buf数组中。如果获取数据时发现触摸板正在扫描,则返回FSP_ERR_CTSU_SCANNING错误。然后,它检查最大触摸数是否超过了最大值,如果超过了,则将最大触摸数设置为最大值,否则将最大触摸数设置为p_max_touch指针所指向的值。最后,它对每个元素进行处理,将其次级值减去主级值,并将结果保存在g_touch_pad_buf数组的前一半中。这个程序的目的是为了监控触摸板上的触摸情况,并将数据处理成差分形式方便后续使用。
阅读全文