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<Vec3b>(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()创建向量)