那为什么报错(E) Exception caught in handler {"exc": "OpenCV(4.8.0) /io/opencv/modules/imgproc/src/contours.cpp:195: error: (-210:Unsupported format or combination of formats) [Start]FindContours supports only CV_8UC1 images when mode != CV_RETR_FLOODFILL otherwise supports CV_32SC1 images only in function 'cvStartFindContours_Impl'\n", "traceback": "Traceback (most recent call last):\n File \"/opt/nuclio/_nuclio_wrapper.py\", line 118, in serve_requests\n await self._handle_event(event)\n File \"/opt/nuclio/_nuclio_wrapper.py\", line 312, in _handle_event\n entrypoint_output = self._entrypoint(self._context, event)\n File \"/opt/nuclio/main.py\", line 51, in handler\n contours, _ = cv2.findContours(mask_binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)\ncv2.error: OpenCV(4.8.0) /io/opencv/modules/imgproc/src/contours.cpp:195: error: (-210:Unsupported format or combination of formats) [Start]FindContours supports only CV_8UC1 images when mode != CV_RETR_FLOODFILL otherwise supports CV_32SC1 images only in function 'cvStartFindContours_Impl'\n\n", "worker_id": "0"}
时间: 2024-04-21 19:22:37 浏览: 148
根据报错信息,可能是由于传递给`cv2.findContours`函数的`mask_binary`图像格式不正确导致的错误。`cv2.findContours`函数要求输入的图像是单通道、8位无符号整数类型(CV_8UC1)的二值图像。请确保`mask_binary`的数据类型是`np.uint8`,并且只有一个通道。可以使用`mask_binary = mask_binary.astype(np.uint8)`来确保数据类型正确,并使用`cv2.cvtColor`函数将图像转换为灰度图像,例如:
```python
mask_binary = cv2.cvtColor(mask_binary, cv2.COLOR_BGR2GRAY)
```
此外,还要确保`mask_binary`图像是二值图像,即只包含0和255两个像素值。您可以使用阈值函数来确保图像二值化,例如:
```python
_, mask_binary = cv2.threshold(mask_binary, 0, 255, cv2.THRESH_BINARY)
```
这样处理后,再调用`cv2.findContours`函数应该就不会报错了。
相关问题
(E) Exception caught in handler {"exc": "OpenCV(4.8.0) /io/opencv/modules/imgproc/src/contours.cpp:195: error: (-210:Unsupported format or combination of formats) [Start]FindContours supports only CV_8UC1 images when mode != CV_RETR_FLOODFILL otherwise supports CV_32SC1 images only in function 'cvStartFindContours_Impl'\n", "traceback": "Traceback (most recent call last):\n File \"/opt/nuclio/_nuclio_wrapper.py\", line 118, in serve_requests\n await self._handle_event(event)\n File \"/opt/nuclio/_nuclio_wrapper.py\", line 312, in _handle_event\n entrypoint_output = self._entrypoint(self._context, event)\n File \"/opt/nuclio/main.py\", line 51, in handler\n contours, _ = cv2.findContours(mask_binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)\ncv2.error: OpenCV(4.8.0) /io/opencv/modules/imgproc/src/contours.cpp:195: error: (-210:Unsupported format or combination of formats) [Start]FindContours supports only CV_8UC1 images when mode != CV_RETR_FLOODFILL otherwise supports CV_32SC1 images only in function 'cvStartFindContours_Impl'\n\n", "worker_id": "0"}这个报错怎么办
这个报错是由于 `cv2.findContours()` 函数在处理图像时遇到了不支持的格式或组合格式。
错误信息中提到,`findContours()` 函数在 `mode` 参数不等于 `CV_RETR_FLOODFILL` 时,只支持 `CV_8UC1` 格式的图像;而在 `mode` 参数为 `CV_RETR_FLOODFILL` 时,只支持 `CV_32SC1` 格式的图像。
要解决这个问题,你可以尝试检查和调整输入图像的格式,确保它符合 `findContours()` 函数的要求。具体来说,需要确保输入图像是单通道(灰度图像)且数据类型为 `np.uint8` 或 `np.int32`。
以下是一些可能的解决方案:
1. 确保 `mask_binary` 是灰度图像(单通道):你可以使用 `cv2.cvtColor()` 函数将其转换为灰度图像。例如:`mask_binary = cv2.cvtColor(mask_binary, cv2.COLOR_BGR2GRAY)`。
2. 确保 `mask_binary` 的数据类型是正确的:你可以使用 `astype()` 函数将其转换为正确的数据类型。例如:`mask_binary = mask_binary.astype(np.uint8)` 或 `mask_binary = mask_binary.astype(np.int32)`。
3. 检查 `cv2.findContours()` 函数的参数:确保你正确地传递了 `cv2.RETR_EXTERNAL` 和 `cv2.CHAIN_APPROX_SIMPLE` 作为参数。
请根据你的实际情况尝试这些解决方案,并查看是否能够解决问题。如果问题仍然存在,请提供更多的代码和上下文信息,以便更好地帮助你解决问题。
Exception caught in handler {"worker_id": "0", "exc": "OpenCV(4.8.0) /io/opencv/modules/imgproc/src/contours.cpp:195: error: (-210:Unsupported format or combination of formats) [Start]FindContours supports only CV_8UC1 images when mode != CV_RETR_FLOODFILL otherwise supports CV_32SC1 images only in function 'cvStartFindContours_Impl'\n", "traceback": "Traceback (most recent call last):\n File \"/opt/nuclio/_nuclio_wrapper.py\", line 118, in serve_requests\n await self._handle_event(event)\n File \"/opt/nuclio/_nuclio_wrapper.py\", line 312, in _handle_event\n entrypoint_output = self._entrypoint(self._context, event)\n File \"/opt/nuclio/main.py\", line 51, in handler\n contours, _ = cv2.findContours(mask_binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)\ncv2.error: OpenCV(4.8.0) /io/opencv/modules/imgproc/src/contours.cpp:195: error: (-210:Unsupported format or combination of formats) [Start]FindContours supports only CV_8UC1 images when mode != CV_RETR_FLOODFILL otherwise supports CV_32SC1 images only in function 'cvStartFindContours_Impl'\n\n"} 2023-07-16 10:23:22 /opt/nuclio/_nuclio_wrapper.py:395: DeprecationWarning: There is no current event loop 2023-07-16 10:23:22 loop = asyncio.get_event_loop() 2023-07-16 10:24:38 2023-07-16 10:24:40 0: 480x640 1 car, 1 truck, 82.9ms 2023-07-16 10:24:40 Speed: 16.6ms preprocess, 82.9ms inference, 24.2ms postprocess per image at shape (1, 3, 480, 640)
根据你提供的错误信息,问题出现在 `cv2.findContours()` 函数调用时。错误信息提示到了组合格式不受支持的问题。
这个问题通常是由于输入图像的格式不正确导致的。`cv2.findContours()` 函数需要传入一个二值图像(只包含0和255两个像素值)作为输入,而且图像的数据类型应为 `np.uint8`。
你可以尝试在调用 `cv2.findContours()` 函数之前,对 `mask_binary` 进行以下处理,确保输入图像符合要求:
```python
mask_binary = mask_binary.astype(np.uint8) # 将掩码二值图像转换为 np.uint8 类型
```
添加这行代码后,再次运行程序,看看是否能够解决问题。如果问题仍然存在,请确保 `mask_binary` 是一个正确的二值图像,并且数据类型是 `np.uint8`。你可以使用 `print(mask_binary.dtype)` 来检查数据类型,并使用 `print(mask_binary)` 来检查图像的值范围和格式。如果问题仍然存在,请提供更多代码和上下文信息,以便更好地帮助你解决问题。
阅读全文