Создавая в формате OpenCV мат в 2D сетки с помощью вектор&ЛТ;вектор&ЛТ;узел&ГТ; &ГТ;
Я строю алгоритм поиска с использованием OpenCV Mat, где я преобразую Mat в серое изображение, а затем проверяю пиксель, чтобы подписать его на walkable или not walkable с их координатами. Я использовал 2D-вектор для создания сетки узлов. Узел-это класс, содержащий информацию о пикселе. когда я пытаюсь распечатать nodeID из сетки, программа внезапно выключается (например,
grid.grid[10][10]->NodeID).
using namespace std; int gridZise; class location{ public: int x; int y; }; class Node{ public: int gridX; int gridY; bool walkable; location worldPosition; int NodeID; int gCost; int hCost; Node *parent; Node(bool _walkable, int _gridX, int _gridY) { walkable = _walkable; gridX = _gridX; gridY = _gridY; NodeID = gridY * gridZise + gridX; } Node(int _gridX, int _gridY){ gridX = _gridX; gridY = _gridY; NodeID = gridY * gridZise + gridX; } int fCost(){ return gCost + hCost; } }; class Grid{ public: cv::Mat map; vector<vector<Node*> > grid; int gridx; int gridy; Grid(cv::Mat _map){ map = _map; gridx = map.cols; gridy = map.cols; gridZise = map.cols; } void CreateGrid(){ // Set up sizes. (HEIGHT x WIDTH) grid.resize(gridy); for (int i = 0; i < gridy; ++i) grid[i].resize(gridx); // build up the grid for(int i=0; i <gridx;i++){ for(int j=0; j < gridy;j++){ int pixel_val = map.at<int>(i,j); bool _walkable = false; if(pixel_val > 120){//if the value of the pixel is bigger than 120 is walkable _walkable = true; } grid[i][j]->walkable = _walkable; grid[i][j]->gridX = i; grid[i][j]->gridY = j; } } } void PrintGrid(){ for(int i=0; i <gridx;i++){ for(int j=0; j < gridy;j++){ cout << grid[i][j]->NodeID <<endl; } } } vector<Node> GetNeighbours(Node node) { vector<Node> neighbours; for (int x = -1; x <=1; x++) { for (int y = -1; y <= 1; y++) { if (x == 0 && y == 0) continue; int checkX = node.gridX + x; int checkY = node.gridY + y; if(checkX >=0 && checkX < gridx && checkY >=0 && checkY < gridy) { Node neighbour(checkX,checkY); neighbours.push_back(neighbour); } } } return neighbours; } Node nodeFromLocation(location _node){ Node currentNode = *grid[_node.x][_node.y]; return currentNode; } }; using namespace cv; int main() { cv::Mat img; img = imread("maze.jpg"); if(img.empty()){ cout<<"image not load "<<endl; return -1; } cvtColor(img,img,CV_BGR2GRAY); imshow("image",img); waitKey(); Grid grid(img); grid.PrintGrid(); return 0; }
Спасибо.
Что я уже пробовал:
Я стараюсь использовать для использования итерацию, так как ниже этого ничего не печатаю.
for(auto vec : grid) { for(auto x : vec) std::cout<<x->NodeID<<" , "; std::cout << std::endl; }