void Map::colorfullarea(int x,int y,int colorchange) { int label = labels.at<int>(y, x); mousecolor[label] = colorchange+1; for (int x = 0; x < mapImage.rows; x++) { for (int y = 0; y < mapImage.cols; y++) { if (mapImage.at<uchar>(x, y) != 255 && labels.at<int>(x, y) == label) { if (colorchange == 0) { coloredMap.at<cv::Vec3b>(x, y) = cv::Vec3b(255, 100, 100); } else if (colorchange == 1) { coloredMap.at<cv::Vec3b>(x, y) = cv::Vec3b(203, 192, 255); } else if (colorchange == 2) { coloredMap.at<cv::Vec3b>(x, y) = cv::Vec3b(100, 100, 255); } else if (colorchange == 3) { coloredMap.at<cv::Vec3b>(x, y) = cv::Vec3b(255, 255, 0); } } } } }
这段代码是Map类中的colorfullarea(int x, int y, int colorchange)函数。该函数用于根据指定的颜色变化参数(colorchange)将指定区域的图像颜色进行修改。
首先,函数获取给定坐标(x, y)处的区域标签(label)值,然后将该标签对应的mousecolor数组中的值设为colorchange+1。
接下来,通过两个嵌套的循环遍历整个图像(mapImage)的每个像素点。如果当前像素点的值不等于255并且对应的标签值与之前获取的标签值相同,则执行相应的颜色修改操作。
根据colorchange的不同取值,将coloredMap图像中对应位置的像素点设置为不同的颜色。如果colorchange为0,将像素点设置为红色;如果colorchange为1,将像素点设置为淡紫色;如果colorchange为2,将像素点设置为蓝色;如果colorchange为3,将像素点设置为黄色。
需要注意的是,这段代码中有一个变量重名的问题。在第一个for循环中,使用了与函数参数相同名称的变量x,这会导致内部循环中的x变量被遮盖。建议将内部循环中的变量名改为其他名称,以避免混淆。
请注意,我只能对给出的代码进行分析和解释,并不能执行它们。如果你有任何问题,请随时提问。
int colorchange = -1; int mousecolor[150] = {0}; void onmouse(int event, int x, int y, int flags, void* param) { if (event == 1) { std::cout << "点击坐标:" << "(" << x << "," << y << ")" << std::endl; Map* map2; map2 = (Map*)param; colorchange++; map2->colorfullarea(x,y,colorchange%4); cv::imshow("play", map2->getcoloredMap()); if (map2->isfour()) { std::cout << "成功通关!" << std::endl; } } }
这段代码定义了一个名为onmouse的回调函数,用于处理鼠标事件。当鼠标按下时,会执行一系列操作。
首先,打印出点击的坐标位置(x, y)。接着,创建了一个名为map2的Map指针,并将参数param转换为Map类型的指针。然后,将colorchange加1,并对4取余,得到一个0到3的循环变化的colorchange值。
接下来,通过调用map2指针指向的Map对象的colorfullarea(x, y, colorchange%4)函数来对指定区域进行颜色修改。
然后,使用cv::imshow函数显示修改后的图像,其中第一个参数为窗口名称"play",第二个参数为map2指向的Map对象的getcoloredMap()函数返回的图像。
最后,通过调用map2指向的Map对象的isfour()函数,判断是否成功通关,并在控制台打印出相应的信息。
需要注意的是,这段代码中使用了全局变量colorchange和mousecolor,可能会对其他部分的代码产生影响。同时,需要确保在调用cv::setMouseCallback函数时将onmouse函数作为参数传入。
请注意,我只能对给出的代码进行分析和解释,并不能执行它们。如果你有任何问题,请随时提问。
相关推荐

















