C++ OpenCV Mat 像素值和 OpenCV 错误

Posted

技术标签:

【中文标题】C++ OpenCV Mat 像素值和 OpenCV 错误【英文标题】:C++ OpenCV Mat pixel value and Opencv Errors 【发布时间】:2018-11-24 14:52:29 【问题描述】:

我正在使用 Visual Studio 和 opencv 编写一个简单的 C++ 应用程序,它存储图像中的红色、绿色和蓝色值(在代码中命名为 src),并将每个红色、绿色、蓝色像素值分别存储在 3 个不同的 Mat 对象中(在代码中命名为 RM,BM,GM)。我看到了这个*** question 并完全按照第一个答案的解释。我能够很好地保存所有像素值,但无法更改其他图像的像素值,因为调用了 Abort()。这是我运行代码后的控制台窗口。 Console Window

#include<opencv2/core.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/imgproc.hpp>
#include <stdio.h>
using namespace cv;
using namespace std;
int main() 
    String file_name = "C:\\images\\haaand.jpg";
    Mat src;
    Mat RM, BM, GM;
    //RM.create(src.cols, src.rows, CV_8UC(2));
    //BM.create(src.cols, src.rows, CV_8UC(2));
    //GM.create(src.cols, src.rows, CV_8UC(2));
    Vec3b intensity;
    Vec3b To[3];
    src = imread(file_name);
    imshow("src", src);
    printf("cols:%d rows:%d \n", src.cols, src.rows);
    for (int i = 0; i < src.cols; i++) 
        for (int j = 0; j < src.rows; j++) 
            intensity = src.at<Vec3b>(j, i);
            printf("intensity:%d %d %d \n", intensity[0], intensity[1], intensity[2]);
            for (int k = 0; k < 3; k++) 
                //uchar bla;
                //bla = intensity[k];
                for (int p = 0; p < 3; p++) 
                    To[k][p] = intensity[k];
                
                printf("(k:%d) %d %d %d\n", k, To[k][0], To[k][1], To[k][2]);
            
            printf("all done\n");
            BM.at<Vec3b>(j, i) = To[0];
            GM.at<Vec3b>(j, i) = To[1];
            RM.at<Vec3b>(j, i) = To[2];
        
    
    imshow("RM", RM);
    imshow("BM", BM);
    imshow("GM", GM);
    return 0;

谁能告诉我为什么会发生这个错误?

【问题讨论】:

【参考方案1】:
//RM.create(src.cols, src.rows, CV_8UC(2));
//BM.create(src.cols, src.rows, CV_8UC(2));
//GM.create(src.cols, src.rows, CV_8UC(2));
...
BM.at<Vec3b>(j, i) = To[0];

RM, BM, and GM 未设置。当您尝试设置BM.at&lt;Vec3b&gt;(j, i) 时,调试器应该会显示错误。

试试吧:

int main() 

    String file_name = "C:\\images\\haaand.jpg";
    Mat src = imread(file_name);
    Mat RM = Mat(src.size(), CV_8UC3);
    Mat BM = Mat(src.size(), CV_8UC3);
    Mat GM = Mat(src.size(), CV_8UC3);
    Vec3b intensity;
    Vec3b To[3];
    for(int i = 0; i < src.cols; i++) 
    
        for(int j = 0; j < src.rows; j++) 
        
            intensity = src.at<Vec3b>(j, i);
            for(int k = 0; k < 3; k++) 
                for(int p = 0; p < 3; p++) 
                    To[k][p] = intensity[k];
            BM.at<Vec3b>(j, i) = To[0];
            GM.at<Vec3b>(j, i) = To[1];
            RM.at<Vec3b>(j, i) = To[2];
        
    

    imshow("src", src);
    imshow("RM", RM);
    imshow("BM", BM);
    imshow("GM", GM);
    waitKey(0);
    return 0;

【讨论】:

以上是关于C++ OpenCV Mat 像素值和 OpenCV 错误的主要内容,如果未能解决你的问题,请参考以下文章

用于 OpenCv C++ 中像素像素操作的 Mat 与数组

C++的opencv里怎么读取Mat图像中特定坐标的灰度值?

使用 c++ 和 opencv 计算 Mat 的大小和方向时出错

opencv4opencv教程 C++ 4Mat对象(深拷贝:clone()copyTo(),create()创建图片,zeros()eye()初始化空白图像,Scalar()创建向量)

opencv 怎么取到灰度图像的像素值,C++接口的

OpenCV - 无法访问 Mat 中的所有像素