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

VisualStudio opencv配置

OpenCV 程序无法在 Visual Studio 2010 上编译

为 Visual Studio 2010 设置 OpenCV-2.3