Ошибка std::bad_alloc при передаче cv::Mat из C++ в Python через Pybind11 для вывода YOLOC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Ошибка std::bad_alloc при передаче cv::Mat из C++ в Python через Pybind11 для вывода YOLO

Сообщение Anonymous »

Я работаю над интерфейсом C++ для модели Python, используя Pybind11 и OpenCV. Моя цель — прочитать изображение с помощью OpenCV на C++ (cv::Mat), передать его в модель Python YOLO (Ultralytics) и получить результаты вывода. Модель Python загружается через Pybind11.
Изначально эта настройка работает, но когда я меняю свой интерфейс C++, чтобы он принимал cv::Mat вместо py::object для ввода изображения, я столкнулся с ошибкой std::bad_alloc во время вывода YOLO в Python.
Ключевой код:
Основной код C++:

Код: Выделить всё

py::module cv2 = py::module::import("cv2");
py::object img = cv2.attr("imread")(image_path);  // Works fine initially

cv::Mat cv_img = cv::imread(image_path, cv::IMREAD_COLOR);  // Causes `std::bad_alloc`

ModelWrapper model(model_path);
while (count < 1) {
count++;
std::vector results = model.predict(img);  // pass `img` to model
}
Оболочка модели C++:

Код: Выделить всё

cpp

std::vector ModelWrapper::predict(const py::object& img) {
py::object py_result = pInstance.attr("predict")(img);
// handle results
}
Код модели Python:

Код: Выделить всё

python

from ultralytics import YOLO

class MODEL:
def __init__(self, model_path: str = "./best.pt"):
self.model = YOLO(model_path)

def predict(self, image: np.ndarray) -> list:
results = self.model.predict(image)
# process results
return sorted_result
Проблема:
Когда я читаю изображение с помощью cv::imread в C++, программа вылетает с ошибкой std::bad_alloc во время YOLO вывод в Python. Ошибка не возникает, если я использую cv2.imread Python для загрузки изображения.
Я также проверил, что изображение читается правильно, записав его в файл (cv::imwrite ), но ошибка по-прежнему возникает при передаче в модель Python.
Что я пробовал:
  • Проверено версии OpenCV как на C++, так и на Python являются то же самое.
  • Пыталась клонировать cv::Mat перед передачей его в Python, но это не решило проблему.
  • Упростил код для проверки если проблема специфична для Pybind11 или OpenCV.
Вопрос:
Почему возникает ошибка std::bad_alloc возникают при использовании cv::imread на C++ и передача изображения в Python через Pybind11, хотя это работает при использовании cv2.imread Python? Как решить эту проблему с распределением памяти при передаче cv::Mat между C++ и Python?

Подробнее здесь: https://stackoverflow.com/questions/792 ... d11-for-yo
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»