C++ OpenCV使用循环求和部分图像错误?
我想在图像中移动,并在图像中的每个像素周围取一个5x5网格。然后,我想对该网格求和,并将其与阈值进行比较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
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;
}