鱼C论坛

 找回密码
 立即注册
查看: 1275|回复: 1

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

[复制链接]
发表于 2023-3-31 19:50:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 白牡丹秀色可餐 于 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[col] = saturate_cast<uchar>(5 * current[col] - (current[col+offsetx]+current[col-offsetx]+previous[col]+next[col]));
                }
        }
        namedWindow("output image", CV_WINDOW_AUTOSIZE);
        imshow("output image", dst);

        waitKey(0);

        return 0;
}
运行后是这样的
0bee1018688af1633f1dde3d8351648.png
删除后面的掩膜操作是能够显示图片的
72437803637fe56a3ec1a38b2a6a2a9.png
检查过代码和视频里教的没有区别但是就是卡住了,请问这是为什么?
最佳答案
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 中使用的是行优先存储方式。

你可以尝试按照上述方法修改代码,并再次运行程序。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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 中使用的是行优先存储方式。

你可以尝试按照上述方法修改代码,并再次运行程序。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-7 17:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表