【问题标题】:Showing image with changed pixel values openCV显示具有更改像素值的图像openCV
【发布时间】:2014-10-28 10:26:10
【问题描述】:

我是 openCV 和 C++ 的新手。我想更改我加载的图像的像素值并在另一个窗口中显示该新图像以比较结果(只是视觉上)。但是,当我运行代码时,我得到了两个原始图像。这意味着要么我的 for 循环没有做它应该做的事情(我怀疑这对我有意义)或者像素值丢失并且没有被保存以显示新图像。我读过之前的一篇文章,说我应该在处理每个像素以设置到更改后的图像后包含此语句。语句为:img.at(Point(x,y)) = color.

有人可以告诉我我做错了什么吗?

谢谢

    cv::Mat img = cv::imread("12.jpg", CV_LOAD_IMAGE_COLOR);

    // start of pixel navigation

    Mat navigateImage(Mat) {

        for(int x = 0; x > img.rows; x++) 
        {
            for(int y = 0; y > img.cols; y++){

                Vec3b color = img.at<Vec3b>(Point(x,y));
                if ( color[0] > 10 && color [1] > 10 && color[2]> 10 )
                {
                    color[0] = 0 ;
                    color[1] = 0;
                    color[2] = 0;

                    img.at<Vec3b>(Point(x,y)) = color;
                }
                else
                {
                    color.val[0] = 255 ;
                    color.val[1] = 255;
                    color.val[2] = 255;

                    img.at<Vec3b>(Point(x,y)) = color;

                }
            }

        }
        return img;
    }

    // end of pixel navigation


    int main( int argc, char** argv )
    {

    if(! img.data){

        cout << "could not open or find the image" << endl;
        return -1;}

        Mat newImage = navigateImage(img);

        cv::imshow( " Original", img);
        cv::imshow( " Altered ", newImage);


        cv::waitKey(0);
        return 0;

    }

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:

    (1)。首先,

    for(int x = 0; x > img.rows; x++)
    

    for(int y = 0; y > img.cols; y++)
    

    应该是

    for(int x = 0; x < img.cols; x++)
    

    for(int y = 0; y < img.rows; y++)
    

    分别。

    由于这个错误,您永远不会进入循环,因此两个图像都是相同的。

    (2)。其次,

    Mat navigateImage(Mat)
    

    应该是

    Mat navigateImage(Mat img)
    

    (3)。第三,放

    cv::Mat img = cv::imread("12.jpg", CV_LOAD_IMAGE_COLOR);
    

    main 函数中。

    (4)。最后, 替换,

    Mat newImage = navigateImage();
    

    通过

    Mat newImage = navigateImage(img.clone());
    

    否则,两个图像将相同。

    更正的代码 -

    #include <iostream>
    #include <opencv2/opencv.hpp>
    
    using namespace cv;
    using namespace std;
    // start of pixel navigation
    
    Mat navigateImage(Mat img) {
    
        for(int x = 0; x < img.cols; x++)
        {
            for(int y = 0; y < img.rows; y++){
    
                Vec3b color = img.at<Vec3b>(Point(x,y));
                if ( color[0] > 10 && color [1] > 10 && color[2]> 10 )
                {
                    color[0] = 0 ;
                    color[1] = 0;
                    color[2] = 0;
    
                    img.at<Vec3b>(Point(x,y)) = color;
                }
                else
                {
                    color.val[0] = 255 ;
                    color.val[1] = 255;
                    color.val[2] = 255;
    
                    img.at<Vec3b>(Point(x,y)) = color;
    
                }
            }
    
        }
        return img;
    }
    
    // end of pixel navigation
    
    
    int main( int argc, char** argv )
    {
        Mat img = cv::imread("12.png", CV_LOAD_IMAGE_COLOR);
    
        if(! img.data){
            cout << "could not open or find the image" << endl;
            return -1;
        }
        Mat newImage = navigateImage(img.clone());
        cv::imshow( " Original", img);
        cv::imshow( " Altered ", newImage);
        cv::waitKey(0);
        return 0;
    
    }
    

    【讨论】:

    • 谢谢你,我实际上只是注意到了这一点。是的,这完全没有意义。现在我从编译器得到一个错误,它说明了内存没有被正确访问。访问冲突读取位置
    • 非常感谢,现在我知道了这个东西是如何工作的。我认为访问冲突读取错误来自我的 IDE。我不知道如何绕过它。
    • 太棒了!它就像一个魅力,只是为了将来参考你知道访问冲突错误来自哪里吗?
    • 我真的不能说,不调试代码。但是,您可以执行调试。通常,当您尝试访问存在的内存时会发生访问冲突,例如空引用。
    • 我添加了一种检测感兴趣区域的方法,但我一直遇到相同的访问内存问题,我遵循了文档和您对先前代码的建议。但是我不断收到访问冲突错误消息。遇到这样的错误很郁闷
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    • 2015-12-18
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    相关资源
    最近更新 更多