, поэтому я стараюсь понять, почему я получаю эту ошибку утверждения из opencv при доступе к указателю в следующем столбце/строке изображения. Позвольте мне рассказать вам, что происходит и предоставить какой-то код.Ошибка утверждения при доступе к указателю на пиксели openCV
- Я беру ROI от образа, который является
cv::Mat
или заголовок секции большойcv::Mat
. Я построил несколько указателей, чтобы получить доступ к значению моей ROI. Так что давайте говорить мой ROI заполняется значениями пикселей и 3х3 Mat
with the following Dimensions (index starting at 0,0) --------- | 1 | 2 | 3 | | 4 | 5 | 6 | | 7 | 8 | 9 |
первую очередь мне нужно инициализировать свои указатели, чтобы указать на их позиции соответственно. Я взял
ptr
функциюcv::Mat
и их местоположение в сетке черезcv::Point
.
Проблема столкнулась:
Когда я пытаюсь получить доступ к пикселю следующего соседа, я получаю ошибку утверждения.
Диагностика на меня:
- Я думал, что это может быть диапазон, но я убедился, что не было бы в случае, определив для условий цикла в соответствии с моими размерами.
- Элемент, который я пытаюсь получить, не существует, но как я его понимаю, когда я просматриваю ROI, у меня уже есть значения в новой матрице, и я должен иметь доступ ко всем значениям вокруг моих желаемых пикселей.
часть кода:
cv::Mat ROI =disTrafo(cv::Rect(cv::Point(x,y),cv::Size(3,3)));
cv::minMaxLoc(ROI,&minVal,&maxVal,&minCoord,&maxCoord);
auto* maxPtr_x = &maxCoord.x;
auto* maxPtr_y = &maxCoord.y;
auto* maxPtr_value = &maxVal;
uchar diff1 = 0;
uchar diff2= 0;
uchar diff3 = 0;
uchar diff4 = 0;
uchar max_diff = 0;
for(int j = 1; j < ROI.rows ; j++){
auto current = ROI.ptr<uchar>(maxCoord.y);
auto neighbor_down = ROI.ptr<uchar>(maxCoord.y+1); //THE PROB IS HERE according to debugging
auto neighbor_up = ROI.ptr<uchar>(maxCoord.y-1);
cv::Point poi ; //point of interest
for(int i= 0; i < ROI.cols; i++){
switch(maxCoord.x){ //PROOF FOR LOGIC
case 0:
if(maxCoord.y == 0){ //another switch statement maybe ??
diff1 = std::abs(current[maxCoord.x+1] - current[maxCoord.x]);
diff2 = std::abs(neighbor_down[maxCoord.x] - current[maxCoord.x]);
if(diff2 > diff1){
cv::Point(maxCoord.x,maxCoord.y+1) = poi;
} else {
cv::Point(maxCoord.x+1,maxCoord.y) = poi;
}
};
Assertion Failed при выполнении его: OpenCV Error: Утверждение не удалось (у == 0 || < данных & & тускнеет> = 1 & & (unsigned) y < (без знака) size.p [0])) в cv :: Mat :: ptr, file // ... указывает путь к заголовочному файлу mat.hpp // строка 428
Я не могу пощупать проблему, не могли бы вы помочь. И, пожалуйста, дайте мне некоторые знания при работе с указателями и пикселями в случае, если я что-то неправильно понял.
Спасибо
Просьба указать, какое подтверждение не удалось (сообщение об ошибке) – Micka
УКАЗАНИЕ при запуске: ошибка OpenCV: утверждение не выполнено (y == 0 || = 1 && (unsigned) y <(без знака) размер .p [0])) в cv :: Mat :: ptr, file // ... указывает путь к макету заголовка.hpp // строка 428 и VS выбрасывает ее как cv :: Exception – Engin007
вы можете: 'std :: cout << maxCoord.y << std :: endl' before' auto current = ROI.ptr (maxCoord.y); 'и сообщить последнее значение? –
Micka