我想在图像上绘制圆圈,在绘制下一个圆圈之前,在图像上删除每个前一个圆圈。
我必须遵循以下配置:
我有几张照片(让我们说10)
对于每张图片,我在某些条件下测试几个像素(比方说50像素)。
对于我测试(或处理)的每个像素,我想在该像素处绘制一个圆圈以供可视化(我可以看到该像素)。
总结一下,我有2个for循环,一个循环遍历10个图像,另一个循环遍及50个像素。
我做了以下(见上面的代码)。圆圈被正确绘制,但是当绘制下一个圆圈时,前一个圆圈仍然可见(最后所有圆圈都绘制在同一个图像上)但我想要的是(在绘制圆圈后)关闭图片(或窗口)以某种方式重新打开一个新的并在其上绘制下一个圆圈等等
for(int imgID=0; imgID < numbImgs; imgID++)
{
cv::Mat colorImg = imgVector[imgID];
for(int pixelID=0; pixelID < numPixelsToBeTested; pixelID++)
{
some_pixel = ... //some pixel
x = some_pixel(0); y = some_pixel(1);
cv::Mat colorImg2 = colorImg; //redefine the image for each pixel
cv::circle(colorImg2, cv::Point(x,y),5, cv::Scalar(0,0,255),1, cv::LINE_8, 0);
// creating a new window each time
cv::namedWindow("Display", CV_WINDOW_AUTOSIZE );
cv::imshow("Display", colorImg2);
cv::waitKey(0);
cv::destroyWindow("Display");
}
}
我的代码有什么问题? 谢谢你们
答案 0 :(得分:0)
cv::circle()
操纵API调用中的输入图像,因此您需要做的是创建原始图像的克隆,在克隆的图像上绘制圆圈,并在每次迭代时将克隆的图像与原始图像交换
将程序分解为更小的方法也是一个好主意,使代码更易读,易于理解。下面的代码可能会给你一个起点。
void visualizePoints(cv::Mat mat) {
cv::Mat debugMat = mat.clone();
// Dummy set of points, to be replace with the 50 points youo are using.
std::vector<cv::Point> points = {cv::Point(30, 30), cv::Point(30, 100), cv::Point(100, 30), cv::Point(100, 100)};
for (cv::Point p:points) {
cv::circle(debugMat, p, 5, cv::Scalar(0, 0, 255), 1, cv::LINE_8, 0);
cv::imshow("Display", debugMat);
cv::waitKey(800);
debugMat = mat.clone();
}
}
int main() {
std::vector<std::string> imagePaths = {"path/img1.png", "path/img2.png", "path/img3.png"};
cv::namedWindow("Display", CV_WINDOW_AUTOSIZE );
for (std::string path:imagePaths) {
cv::Mat img = cv::imread(path);
visualizePoints(img);
}
}