OpenCV + visualStudio,尝试访问像素的 C++ 代码错误
Posted
技术标签:
【中文标题】OpenCV + visualStudio,尝试访问像素的 C++ 代码错误【英文标题】:OpenCV + visualStudio , C++ code error trying to access pixels 【发布时间】:2017-12-28 14:47:45 【问题描述】:我是 Joe,是本网站的新成员。 言归正传……我开始在 Visual Studio 上使用 openCV 库在 c++ 中编程,但我有一个关于图像像素的问题。 我写了一个代码来计算 alpha 通道的平均值(像素的第四个分量,除了 B、G、R 强度的值).. 在此处输入图像描述 我陷入了一个错误,我不知道如何解决它。 这是我的代码
#include "stdafx.h"
#include "opencv2\highgui\highgui.hpp"
#include "opencv2\core\core.hpp"
#include "opencv2\opencv.hpp"
using namespace cv;
using namespace std;
int main()
Mat image;
image = imread("C:/Users/Joe/Desktop/prova/paesaggioLuminoso.jpg", 1);
namedWindow("Picture", WINDOW_AUTOSIZE);
imshow("Picture", image);
waitKey(0);
int averageAlpha = 0;
int partial = 0;
for (int i = 0; i < image.rows; i++)
for (int j = 0; j < image.cols; j++)
partial = partial +image.at<Vec4b>(i, j)[3];
if (i == image.rows - 1 && j == image.cols - 1)
averageAlpha = partial / (image.rows * image.cols);
cout << "Average of alpha channel is " << averageAlpha << endl;
return 0;
请注意,如果我尝试计算 B 强度(或绿色或红色)的平均值,我的程序运行正确。
但是对于第四个频道,我收到以下错误消息: Secondo Progetto OpenCV.exe 中 0x00007FFC47603FB8 处未处理的异常:Microsoft C++ 异常:内存位置 0x000000162E2FF3E0 处的 cv::Exception。
在 cv::Mat::at,文件 c:\ 中断言失败 ((unsigned)(i1 * DataType<_tp>::channels) 1 * channels())) users\joe\desktop\joe\opencv\opencv\build\include\opencv2\core\mat.inl.hpp,第 1095 行
感谢您的帮助!祝你有美好的一天 !
编辑:这是我在评论中提到的错误
Errors in visual studio with a correct code
Other errors
enter image description here
【问题讨论】:
“我写了一个代码来计算平均值”——重新发明cv::mean
?
ups :)) 抱歉,我还是个编码新手!
更多理由让自己熟悉 OpenCV 文档并了解可用的功能类型以及在何处查找信息的要点。 ;)
谢谢你的帮助和你的心态!也许您知道为什么有时 Visual Studio 会在五分钟前正常工作的相同(相同!)代码上给我错误? :)
@Joe 在我看来就像您打开了一个 opencv 内部标头并意外删除了某些内容。我认为typname
应该是typename
。我会说只是重新安装opencv
【参考方案1】:
您作为标志 '1' 传递,等于 IMREAD_COLOR 看到这个:https://github.com/opencv/opencv/blob/master/modules/imgcodecs/include/opencv2/imgcodecs.hpp
而 IMREAD_COLOR 会丢弃 alpha 通道,请参阅此 https://docs.opencv.org/3.1.0/d4/da8/group__imgcodecs.html#ga61d9b0126a3e57d9277ac48327799c80
所以你应该这样做
image = imread("C:/Users/Joe/Desktop/prova/paesaggioLuminoso.jpg", IMREAD_UNCHANGED);
【讨论】:
非常感谢!我想试试你的代码行,但现在我遇到了一个新问题,不知道为什么,我的 Visual Studio 不再编译了。我有这个:错误C2061:语法错误:标识符'typname',错误C4430:缺少类型说明符-假定为int。注意:C++ 不支持 default-int 和其他错误..不知道为什么..一个小时前我的代码有效,现在不行了! :( @Joe 尝试传递 -1 而不是 IMREAD_UNCHANGED。 非常感谢;我尝试了您建议的两种方式(IMREAD_UNCHANGED 和 -1 ),但我陷入了这些错误:[1]:i.stack.imgur.com/78hna.png [2]:i.stack.imgur.com/g5ZFq.png @Joe 尝试打印通道数,在 imshow put cout 哦,谢谢@Aram:频道数是 3。现在我明白了……非常感谢!以上是关于OpenCV + visualStudio,尝试访问像素的 C++ 代码错误的主要内容,如果未能解决你的问题,请参考以下文章
OpenCV 3.2.0、Visual Studio 2015、Windows 7
Visual Studio、OpenCV、Python - 应用程序中没有网络摄像头
Visual Studio 2013 控制台应用程序中的 Qt 和 opencv