白牡丹秀色可餐 发表于 2023-3-31 19:50:37

openCV C++ 图像处理掩膜处理(结果是写了个死循环。。。)

本帖最后由 白牡丹秀色可餐 于 2023-3-31 19:59 编辑

我照着视频打了一个掩膜图像处理,是将图像的每个像素进行掩膜处理使之更加清晰,详情请看这个链接https://blog.csdn.net/weixin_44651073/article/details/126207765
但是一直运行不出来,请问这个是为什么?
这是代码
#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>
#include <opencv2/highgui/highgui_c.h>

using namespace cv;

int main() {
        Mat src, dst;
        src = imread("D:/C++/OpenCV/test.jpg");
        if (!src.data) {
                printf("could not load image...\n");
                return -1;
        }
        namedWindow("input image", CV_WINDOW_AUTOSIZE);
        imshow("input image", src);
       
        dst = Mat::zeros(src.size(), src.type());

        int cols = (src.cols-1) * src.channels();//得到图像宽度=图像宽度*图像通道数(RGB有三个通道每个cols有三个值,所以相乘得到总数)
        int offsetx = src.channels();
        int rows = src.rows;//得到图像长度
        for (int row = 1; row < (rows - 1); row++) {
                //获取每一个通道的指针
                const uchar* current= src.ptr<uchar>(row);
                const uchar* previous = src.ptr<uchar>(row - 1);
                const uchar* next = src.ptr<uchar>(row + 1);
                uchar* count = dst.ptr<uchar>(row);
                for (int col = offsetx; col < cols; col++) {
                        count = saturate_cast<uchar>(5 * current - (current+current+previous+next));
                }
        }
        namedWindow("output image", CV_WINDOW_AUTOSIZE);
        imshow("output image", dst);

        waitKey(0);

        return 0;
}
运行后是这样的

删除后面的掩膜操作是能够显示图片的

检查过代码和视频里教的没有区别但是就是卡住了,请问这是为什么?

isdkz 发表于 2023-3-31 19:57:33

根据你提供的代码,很可能是以下问题导致程序无法正常运行:

1、代码中第14行,使用了错误的OpenCV窗口标志CV_WINDOW_AUTOSIZE,应该改为WINDOW_AUTOSIZE。

2、代码中第23行的循环条件应该是 row < (rows - 1),而不是 rows < (rows - 1)。

3、代码中第30行,获取 previous 和 next 指针时,应该将 row - 1 和 row + 1 作为参数传递,而不是 row + 1 和 row - 1。这是因为 OpenCV 中使用的是行优先存储方式。

你可以尝试按照上述方法修改代码,并再次运行程序。
页: [1]
查看完整版本: openCV C++ 图像处理掩膜处理(结果是写了个死循环。。。)