Ошибка OpenCV (3.4.1): утверждение не выполнено (dims <= 2 && шаг [0] > 0) в cv::Mat::locateROIC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Ошибка OpenCV (3.4.1): утверждение не выполнено (dims <= 2 && шаг [0] > 0) в cv::Mat::locateROI

Сообщение Anonymous »

Я опубликую свой код и исключение после объяснения проблемы. По сути, я создаю программу, конечной целью которой является возможность калибровать камеру типа «рыбий глаз», которая затем передается в потоке rtsp от камеры, который будет записываться через Zoneminder с использованием OpenCV, и большую часть кода, который я получил отсюда:

http://aishack.in/tutorials/калибровка- ... v-oh-yeah/

Но я только начал замечать исключение, которое появляется в строке 53 моего кода

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

 bool found = findChessboardCorners(image, board_sz,corners, CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FILTER_QUADS);
и я понятия не имею, что именно является причиной этого, я все еще новичок во многом из того, что я пытаюсь сделать с переполнением стека в целом, поэтому не стесняйтесь оставлять любую информацию, которая, по вашему мнению, может оказаться полезной, или задавать любые вопросы, которые, возможно, придется задать.

Также небольшое примечание, если вы запускаете код самостоятельно: переполнение стека, похоже, любит разбивать определенные строки, поэтому имейте это в виду вместе с тем фактом, что вам понадобится OpenCV.

Код:

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

// ConsoleApplication2.cpp : Defines the entry point for the console
application.

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace cv;
using namespace std;

int main (){
int numBoards = 0;
int numCornersHor;
int numCornersVer;

printf("Enter number of corners along width: ");
scanf_s("%d", &numCornersHor);

printf("Enter number of corners along height: ");
scanf_s("%d", &numCornersVer);

printf("Enter number of boards: ");
scanf_s("%d", &numBoards);

int numSquares = numCornersHor * numCornersVer;
Size board_sz = Size(numCornersHor, numCornersVer);

VideoCapture capture = VideoCapture("rtsp://172.16.127.27:554/mpeg4");

vector object_points;
vector image_points;

vector corners;
int successes = 0;

Mat image;
Mat gray_image;
capture >> image;

vector obj;
for (int j = 0; j < numSquares; j++)
obj.push_back(Point3f(j / numCornersHor, j%numCornersHor, 0.0f));

while (successes < numBoards) {
this_thread::sleep_for(chrono::milliseconds(100));
cvtColor(image, gray_image, CV_BGR2GRAY);

bool found = findChessboardCorners(image, board_sz, corners,
CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FILTER_QUADS);

if (found) {
cornerSubPix(gray_image, corners, Size(11,11), Size(-1, -1),
TermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 30, 0.1));
drawChessboardCorners(gray_image, board_sz, corners, found);
}

imshow("win1", image);
imshow("win2", gray_image);

capture >> image;
int key = waitKey(1);

if (key == 27)

return 0;

if (key == ' ' && found != 0){
image_points.push_back(corners);
object_points.push_back(obj);

printf("Snap stored!");

successes++;

if (successes >= numBoards)
break;
}
}

Mat intrinsic = Mat(3, 3, CV_32FC1);
Mat distCoeffs;
vector rvecs;
vector tvecs;

intrinsic.ptr(0)[0] = 1;
intrinsic.ptr(1)[1] = 1;

calibrateCamera(object_points, image_points, image.size(), intrinsic,
distCoeffs, rvecs, tvecs);

Mat imageUndistorted;
while (1) {
capture >> image;
undistort(image, imageUndistorted, intrinsic, distCoeffs);

imshow("win1", image);
imshow("win2", imageUndistorted);
waitKey(1);
}

capture.release();

return 0;
}
Ошибка в консоли:

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

OpenCV(3.4.1) Error: Assertion failed (dims   0) in
cv::Mat::locateROI, file C:\build\master_winpack-build-win64-
vc15\opencv\modules\core\src\matrix.cpp, line 760
Исключение:

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

Exception thrown at 0x00007FFEFC21A388 in ConsoleApplication2.exe: Microsoft
C++ exception: cv::Exception at memory location 0x000000637891D640.
Exception thrown at 0x00007FFEFC21A388 in ConsoleApplication2.exe: Microsoft
C++ exception: [rethrow] at memory location 0x0000000000000000.
Exception thrown at 0x00007FFEFC21A388 in ConsoleApplication2.exe: Microsoft
C++ exception: cv::Exception at memory location 0x000000637891D640.
Unhandled exception at 0x00007FFEFC21A388 in ConsoleApplication2.exe:
Microsoft C++ exception: cv::Exception at memory location 0x000000637891D640.
Редактировать: как ни странно, у меня больше нет этой проблемы, но я все равно оставлю этот вопрос на случай, если у кого-то еще возникнет эта проблема или появится какое-то понимание, которое все еще может быть актуальным. У меня все еще есть проблема, когда камера, кажется, зависает на первом кадре, который она может захватить по rtsp, несмотря на отсутствие проблемы при использовании веб-камеры, но я оставлю это для отдельного вопроса, поскольку здесь проблема не в этом.

Подробнее здесь: https://stackoverflow.com/questions/509 ... n-cvmatloc
Ответить

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

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

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

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

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