Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenCV使用循环求和部分图像错误?_C++_Opencv_Sum_Rect_Imaging - Fatal编程技术网

C++ OpenCV使用循环求和部分图像错误?

C++ OpenCV使用循环求和部分图像错误?,c++,opencv,sum,rect,imaging,C++,Opencv,Sum,Rect,Imaging,我想在图像中移动,并在图像中的每个像素周围取一个5x5网格。然后,我想对该网格求和,并将其与阈值进行比较 int main() { Mat element = getStructuringElement(MORPH_RECT, Size(7, 7)); Mat im = imread("blob.png", IMREAD_GRAYSCALE); bool fromCenter = false; namedWindow("Crop frame", WINDOW_N

我想在图像中移动,并在图像中的每个像素周围取一个5x5网格。然后,我想对该网格求和,并将其与阈值进行比较

int main()
{
    Mat element = getStructuringElement(MORPH_RECT, Size(7, 7));

    Mat im = imread("blob.png", IMREAD_GRAYSCALE);
    bool fromCenter = false;
    namedWindow("Crop frame", WINDOW_NORMAL);
    Rect2d r = selectROI("Crop frame", im, fromCenter);
    im = im(r);
    erode(im, im, element);
    Mat clone = im;

    int sectionSize = 4;
    int width = im.cols - sectionSize/2;
    int height = im.rows - sectionSize/2;
    int sum = 0;
    int counter = 0;

    for (int i = sectionSize/2; i < width; i++) {
        for (int j = sectionSize/2; j < height; j++) {

            Rect rect = Rect(i, j, sectionSize, sectionSize);
            rect -= Point(rect.width / 2, rect.height / 2);
            Mat temp = im(rect);

            for (int x = 0; x < temp.cols; x++) {
                for (int y = 0; y < temp.rows; y++) {
                    int pixelValue = (int)temp.at<uchar>(y, x);
                    sum += pixelValue;
                }
            }

            cout << sum << endl;

            if (sum > 3800) {
                clone.at<uchar>(j, i) = 255;
            }
            else {
                clone.at<uchar>(j, i) = 0;
            }

            namedWindow("erode", WINDOW_NORMAL);
            imshow("erode", clone);
            waitKey(1);
            sum = 0;

        }
    }
}
intmain()
{
Mat元素=getStructuringElement(变形,大小(7,7));
Mat im=imread(“blob.png”,imread\u灰度);
bool fromCenter=false;
namedWindow(“裁剪框”,窗口正常);
Rect2d r=选择ROI(“裁剪帧”,im,fromCenter);
im=im(r);
侵蚀(im、im、元素);
Mat克隆=im;
int sectionSize=4;
int width=im.cols-截面尺寸/2;
内部高度=内部行-截面尺寸/2;
整数和=0;
int计数器=0;
对于(int i=截面尺寸/2;i<宽度;i++){
对于(int j=截面尺寸/2;j<高度;j++){
Rect Rect=Rect(i,j,截面尺寸,截面尺寸);
rect-=点(rect.width/2,rect.height/2);
材料温度=im(直管);
对于(int x=0;x
请注意,当您执行
Mat clone=img;
操作时,您不会克隆
img
图像。您只需创建一个
Mat
图像,该图像指向与
img
相同的内存。在这行代码之后,您有两个共享相同内存区域的图像,而不会进行数据调整。这就是为什么修改后,总和会发生变化的原因来自
clone
image的像素值。您应该执行
Mat clone=img.clone()
取而代之。@RalucaPandaru解决了所有问题!讽刺的是,我还将我的temp变量克隆命名为哈哈。我不知道你必须为temp数组这么做,非常感谢!如果你不确定给定数据类型的赋值运算符如何工作,你应该阅读文档。有关
Mat
的信息,请查看。
if (sum > 3800) {
                clone.at<uchar>(j, i) = 255;
            }
            else {
                clone.at<uchar>(j, i) = 0;
            }