Изначально эта настройка работает, но когда я меняю свой интерфейс 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
}
Код: Выделить всё
cpp
std::vector ModelWrapper::predict(const py::object& img) {
py::object py_result = pInstance.attr("predict")(img);
// handle results
}
Код: Выделить всё
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
Мобильная версия