读取 cornerharris 目标 Mat 对象的值时出现分段错误

问题描述 投票:0回答:0

我正在尝试使用 cornerharris 函数在图像中查找角点特征。当我尝试检查哪些坐标的值大于 cornerharris 输出 Mat 对象最大值的 1% 时,我将像素值更改为红色。我的逻辑在 python 中似乎工作正常,但在 CPP 中,我在特定坐标处出现分段错误

我试过下面的代码,但遇到了分段错误 if(dst.at(i,j) > corners_perc/100*maxVal)

#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <stdio.h>
#include <iostream>
using namespace cv;
using namespace std;
string type2str(int type) {
  string r;

  uchar depth = type & CV_MAT_DEPTH_MASK;
  uchar chans = 1 + (type >> CV_CN_SHIFT);

  switch ( depth ) {
    case CV_8U:  r = "8U"; break;
    case CV_8S:  r = "8S"; break;
    case CV_16U: r = "16U"; break;
    case CV_16S: r = "16S"; break;
    case CV_32S: r = "32S"; break;
    case CV_32F: r = "32F"; break;
    case CV_64F: r = "64F"; break;
    default:     r = "User"; break;
  }

  r += "C";
  r += (chans+'0');

  return r;
}

Mat getcorners(Mat image){
    Mat dst, image_gray;
    Mat imcopy = image.clone();     
    cvtColor(image, image_gray, COLOR_BGR2GRAY);
    cornerHarris(image_gray, dst, 3, 3, 0.01);
    //Create image copy of same size of image
    Point minLoc, maxLoc;
    double minVal, maxVal;
    minMaxLoc(dst, &minVal, &maxVal, &minLoc, &maxLoc);
    std::cout<<"Max value in dst mat ="<<maxVal<<std::endl;
    int corners_perc = 1;
    
    
    for(int i = 0; i<image.rows; i++){
        for(int j = 0; j<image.cols; j++){
            
            if(dst.at<double>(i,j) > corners_perc/100*maxVal){
            //if(i % 15 == 13){
                imcopy.at<Vec3b>(i,j)[0] = 0;
                imcopy.at<Vec3b>(i,j)[1] = 0;
                imcopy.at<Vec3b>(i,j)[2] = 255;
                //std::cout<<"DST value = "<<dst.at<double>(i,j)<<std::endl;
                if(i>290){
                    std::cout<<"values = "<<dst.at<double>(i,j)<<", i = "<<i<<", j = "<<j<<"\n";
                }
            }
        }
    }
    
    
    
    std::cout<<dst.at<double>(1,10)<<std::endl;
    if(dst.at<double>(1,10) > corners_perc/100*maxVal){
        std::cout<<"values = "<<imcopy.at<double>(1,10)<<"\n";
    }
    std::cout<<"Image values = "<<imcopy.at<Vec3b>(200,450)<<"\n";
    std::cout<<"Image cols = "<<imcopy.cols<<"x"<<imcopy.rows<<"\n"<<"Color: "<<imcopy.at<Vec3b>(imcopy.rows-1, imcopy.cols-1)<<"\n";
    std::cout<<"Dst vals = "<<type2str(dst.type())<<"\n"<<type2str(imcopy.type())<<"\n"<<dst.at<int>(449,460)<<"\n";
    return imcopy;
}

int main(int argc, char** argv)
{
    if (argc != 2) {
        printf("usage: DisplayImage.out <Image_Path>\n");
        return -1;
    }
    Mat image, image_gray, image_corners;
    image = imread(argv[1], 1);
    
    if (!image.data) {printf("No image data \n"); return -1;}
    std::cout<<"Image size = "<<image.size()<<", test = "<<image.size[0]<<"X"<<image.size[1]<<std::endl;

    image_corners = getcorners(image);

    namedWindow("Display Image", WINDOW_AUTOSIZE);
    imshow("Display Image", image_corners);
    waitKey(0);

    return 0;
}
c++ opencv mat
© www.soinside.com 2019 - 2024. All rights reserved.