Opencv c ++。在for循环中在图像的不同像素上画一个圆圈(图像应该在每次循环运行时打开)

时间:2017-06-08 01:12:01

标签: c++ opencv

我想在图像上绘制圆圈,在绘制下一个圆圈之前,在图像上删除每个前一个圆圈。

我必须遵循以下配置:

  1. 我有几张照片(让我们说10)

  2. 对于每张图片,我在某些条件下测试几个像素(比方说50像素)。

  3. 对于我测试(或处理)的每个像素,我想在该像素处绘制一个圆圈以供可视化(我可以看到该像素)。

  4. 总结一下,我有2个for循环,一个循环遍历10个图像,另一个循环遍及50个像素。

  5. 我做了以下(见上面的代码)。圆圈被正确绘制,但是当绘制下一个圆圈时,前一个圆圈仍然可见(最后所有圆圈都绘制在同一个图像上)但我想要的是(在绘制圆圈后)关闭图片(或窗口)以某种方式重新打开一个新的并在其上绘制下一个圆圈等等

    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");
    }
    }
    

    我的代码有什么问题? 谢谢你们

1 个答案:

答案 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);
    }
}