C++ 我在一个程序中对同一个图像得到不同的结果

C++ 我在一个程序中对同一个图像得到不同的结果,c++,opencv,image-processing,C++,Opencv,Image Processing,我制作了一个计算灰度图像中白色像素数的小程序。如果我在同一个程序中打开图像两次,会得到不同的结果。同样,如果我显示像素的强度,即使它是相同的图像,它也会改变。如果有人看到问题所在,请帮助 #include "opencv2/imgcodecs.hpp" #include "opencv2/highgui.hpp" #include "opencv2/imgproc.hpp" #include <iostream> using namespace std; using namespa

我制作了一个计算灰度图像中白色像素数的小程序。如果我在同一个程序中打开图像两次,会得到不同的结果。同样,如果我显示像素的强度,即使它是相同的图像,它也会改变。如果有人看到问题所在,请帮助

#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>

using namespace std;
using namespace cv;
int main()
{ int i=0,j,nbr=0,nbr1=0;


Mat image=imread("2_.png",CV_LOAD_IMAGE_GRAYSCALE);
Mat image2=imread("2_.png",CV_LOAD_IMAGE_GRAYSCALE);

for(i=0;i<image.rows;i++)
{
    for( j=0;j<image.cols;j++)
    {if (image.at<int>(i,j)!=0)
           nbr++;
     if (image2.at<int>(i,j)!=0)
           nbr1++;
    }
}
printf("%d\n %d\n",nbr,nbr1);


    return 0;}
#包括“opencv2/imgcodecs.hpp”
#包括“opencv2/highgui.hpp”
#包括“opencv2/imgproc.hpp”
#包括
使用名称空间std;
使用名称空间cv;
int main()
{int i=0,j,nbr=0,nbr1=0;
Mat image=imread(“2.png”,CV\u LOAD\u image\u灰度);
Mat image2=imread(“2.png”,CV\U LOAD\U IMAGE\U灰度);

对于(i=0;i这可能是因为您需要避免对灰度图像使用
int
,但
uchar
。使用
int
会耗尽图像内存。

这可能是因为您需要避免对灰度图像使用
int
,而
uchar
。使用
int
会耗尽图像内存。

是的,这是一点kes sense,因为如果你每次读取int,最终你的缓冲区会被过度读取;超出缓冲区,数据完全是垃圾。@JeruLuke英文版是错误的,因为你编辑了它。现在它读起来像
int
是可选的,而不是错误的。谢谢,它现在给出了相同的像素数。像at:image.at(i,j)?是,对于元素类型为CV_8UC1(灰度)的图像如果元素类型是CV_32FC1,那么它将是image.at,如果它是color image,那么它将有几个通道,比如CV_8UC3或CV_32FC3,那么访问image.at(对于CV_8UC3)和image.at(对于CV_32FC3)等元素是正确的。是的,这是有意义的,因为如果每次读取int,最终都会有缓冲区过度读取;超过缓冲区,数据是c完全是垃圾。@JeruLuke英文版是错误的,因为你编辑了它。现在它看起来像
int
是可选的,而不是错误的。谢谢你,它现在给出了相同的像素数。像这样访问像素值正确吗:image.at(i,j)?是的,对于元素类型为CV_8UC1(灰度)的图像。如果元素类型为CV_32FC1,则为image.at;如果元素类型为color image,则具有多个通道,如CV_8UC3或CV_32FC3,则正确访问元素,如CV_8UC3的image.at和CV_32FC3的image.at。