为什么会出现中断,而且这种情况处理别的图片就不会出现?该如何修改,代码已经附在下面

发布于 2022-09-04 19:01:10 字数 2450 浏览 24 评论 0

代码功能:将图片中的一部分截取出来
报错图片
图片描述
代码如下:

#pragma warning(disable:4996)  //for sprintf()
#include "makegei.h"
#include <stdio.h>
#define H 40 //500
#define W 30 //400
#define BASE_RATIO 1.25 


GenerateGEI::GenerateGEI(const char* folderpath)
{
    gei_name = new char[100];
    sprintf(gei_name, ".\\%s\\gei_.png", folderpath); //产生的GEI储存位置
    num = 0;
}


GenerateGEI::~GenerateGEI(void)
{
    delete gei_name;
}

int GenerateGEI::InsertImage(Mat image)
{
    num++;
    Process(image);
    return 1;
}

int GenerateGEI::Process(Mat image)
{
    Mat origin = FindContours(image);
    Mat normal = Resize(origin);
    //Mat show_gei = CalGei(normal);
    imwrite(gei_name, normal);
    return 1;
}
//RNG G_RNG(1234);
Mat GenerateGEI::FindContours(Mat image)
{
    Mat image_tmp = image.clone(); //用于findContours,因为该函数使用后会导致原图改变,所以要复制一个用于该函数
#ifdef _DEBUG
    cv::imshow("image", image);
    cv::waitKey(500);
#endif
    std::vector<Contours> contours; //每个轮廓的所有角点理论上只需要contours[0]
    cv::findContours(image_tmp, contours, CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE); //findContours只能处理8UC1和32SC1
    
    
    
    cv::Rect r0 = cv::boundingRect(cv::Mat(contours[0]));
    cv::Mat gait_img_roi = image(r0);
    return gait_img_roi;
}

Mat GenerateGEI::Resize(Mat image)
{
    float ra = image.rows / image.cols;
    cv::Mat gait_roi_tmp;
    Mat gait_img2 = Mat::zeros(H, W, CV_8UC1);
//    if(ra>= BASE_RATIO)
    {
        double resize_scale = (double)H / image.rows;
        cv::resize(image, gait_roi_tmp, cv::Size(), resize_scale, resize_scale); //按比例缩放
        for (int i = 0; i<gait_roi_tmp.rows; i++)
        {
            uchar* p_tmp = gait_roi_tmp.ptr<uchar>(i);
            uchar* p = gait_img2.ptr<uchar>(i);
            for (int j = (W - gait_roi_tmp.cols) / 2, k = 0; k<gait_roi_tmp.cols; k++, j++)
            {
                p[j] = p_tmp[k];
            }
        }
    }
    

    
    return gait_img2;
}


void main()
{
    char folderpath[100] = "\\yyb\\";
    char* filename = "010-nm-05-072-088.png"; //图片名称

    GenerateGEI* generate = new GenerateGEI(folderpath); //传入当前文件夹路径,方便作为生成的GEI文件名
    Mat image = cv::imread(filename, 0); //按单通道读入

    generate->InsertImage(image); 
    delete generate;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文