Ошибка сегментации OpenCV (ядро сброшено) при использовании cv :: Mat :: at

Я пытаюсь нанести на карту cv::Mat пикселей в float4* для расчета CUDA.

cv::Mat frame = cv::imread("peds-007.png", cv::IMREAD_COLOR);

cudaAllocMapped((void**) cpu, (void**) gpu,
frame.cols * frame.rows * sizeof(float) * 4);

float4* cpuPtr = *cpu;
for (uint32_t y = 0; y < frame.rows; y++) {
for (uint32_t x = 0; x < frame.cols; x++) {
std::cout << x << ", " << y << std::endl;
const float4 px = make_float4(float(frame.at<cv::Vec3b>(x, y)[2]),
float(frame.at<cv::Vec3b>(x, y)[1]),
float(frame.at<cv::Vec3b>(x, y)[0]),
float(255));
//float(frame.at<cv::Vec4b>(x, y)[3]));
cpuPtr[y*imgWidth+x] = px;
}
}

Если я запускаю приведенный выше код, я получил Segmentation fault (core dumped),

Последний пиксель, к которому обращается код, имеет вид (1662, 0).

Если я получу прямой доступ к пикселю за пределами цикла:

frame.at<cv::Vec3b>(1662, 0);

Это также вызывает Segmentation fault (core dumped),

Почему это происходит и как я могу решить эту проблему?

-2

Решение

cv :: Mat индексируется в порядке следования строк. Поменяйте местами ваши x и y.

const float4 px = make_float4(float(frame.at<cv::Vec3b>(y,x)[2]),
float(frame.at<cv::Vec3b>(y,x)[1]),
float(frame.at<cv::Vec3b>(y,x)[0]),
float(255));
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]