opencv - 像素处理中的段错误(核心已转储)

标签 opencv segmentation-fault

我正在尝试获得图像的鸟瞰图。我正在更改分别遍历行和列的两个for循环中的像素强度。

birdeyeview_img.at<uchar>(p,q)=(int)undistor_img.at<uchar>(round(corr_x),round(corr_y);

我得到:Segmentation Fault (Core Dumped)。如何更改像素强度,而又不会出现此类错误?我的未失真图像是灰度图像。
现在,我进行了一些更改,它可以运行但不能给出正确的结果,只有一部分代码显示了像素操作://
This code will take undistorted images as input and give the bird's eye view using them
// First we need to calculate the homography matrix
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc_c.h"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

using namespace cv;
using namespace std;

int main()
{ 
//loading the undistorted image
Mat undistor_img=imread("undistorted images/img_u1.jpg", CV_WINDOW_AUTOSIZE);
namedWindow("undistorted image");
imshow("undistorted image",undistor_img);

// storing the resolution values
float resolution_x=50, resolution_y=50;
// height and width for bird's eye view
float heightBirdEyeView=500;
float widthBirdEyeView=700;

//camera height and tilt
float height_camera = 125;
float tilt_camera=12;

float halfAngle=180;
float pi=3.14159;
float alpha = tilt_camera/halfAngle*pi;


//focal length in x and y
float focal_length_x = 354.05700;
float focal_length_y = 353.65297;

//generate transformation matrix
float H1[3][3]={resolution_x,0,widthBirdEyeView/2+1,
        0,-1*resolution_y,heightBirdEyeView,
        0,0,1};
Mat transformation_matrix(3,3,CV_32FC1,H1);
cout<<"transformation matrix="<<endl<<transformation_matrix<<endl<<endl;

//generate top view matrix
float H2[3][3]={height_camera/focal_length_x,0,0,
        0,0,height_camera,
        0,cos(alpha)/focal_length_y,sin(alpha)};
Mat topview_matrix(3,3,CV_32FC1,H2);
cout<<"topview matrix="<<endl<<topview_matrix<<endl<<endl;

//generate scale matrix
float H3[3][3]={1,0,undistor_img.rows,
        0,1,undistor_img.rows,
        0,0,1};
Mat scale_matrix(3,3,CV_32FC1,H3);
cout<<"scale matrix="<<endl<<scale_matrix<<endl<<endl;

//generate the homography matrix from these matrices
Mat homography_matrix=transformation_matrix*topview_matrix/scale_matrix;
cout<<"homography matrix"<<endl<<homography_matrix<<endl<<endl;
cout<<homography_matrix.at<float>(0,0)<<endl;
//now we need transpose of homography matrix

Mat transpose_homography_matrix(3,3,CV_32FC1);
for(int i=0;i<3;i++)
{
    for(int j=0;j<3;j++)
    transpose_homography_matrix.at<float>(i,j)=homography_matrix.at<float>(j,i);
}
cout<<"transpose of homography  matrix"<<endl<<transpose_homography_matrix<<endl<<endl;

Mat birdeyeview_img(heightBirdEyeView, widthBirdEyeView,CV_32FC3);
namedWindow("bird's eye view image");

Mat p_new(3,1,CV_32FC1); // this will give the coordinates in the bird's eye view 
float corrected_x,corrected_y;
int a=0,b=0;
// counters for if and else blocks

//now we need matrix with coordinates of the image plane, to be projected
for(int p=0; p<heightBirdEyeView;p++)
{
    uchar* data= undistor_img.ptr<uchar>(p);
    uchar* hdata= birdeyeview_img.ptr<uchar>(p);
    for(int q=0;q<widthBirdEyeView;q++)
    {
    int M[]={q,p,1};
    Mat p_old(3,1,CV_32FC1,M); //holding the positions in undistorted image
    //cout<<transpose_homography_matrix*p_old<<endl;
    p_new=transpose_homography_matrix*p_old;
    corrected_x=p_new.at<float>(0,0)/p_new.at<float>(2,0);
    corrected_y=p_new.at<float>(1,0)/p_new.at<float>(2,0);

    if (((abs(corrected_y)>=1)&&(corrected_y<=undistor_img.rows))&&((abs(corrected_x)>=1)&&(corrected_x<=undistor_img.cols)))     
           {
    /*hdata[q]=(1- (corrected_y-floor(corrected_y)))*(1-(corrected_x-floor(corrected_x)))*data[q]
                                    +(1-( corrected_y-floor(corrected_y)))*(corrected_x-floor(corrected_x))*data[q]
                                  +( corrected_y-floor(corrected_y))*(1-(corrected_x-floor(corrected_x)))*data[q]
                                +( corrected_y-floor(corrected_y))*(corrected_x-floor(corrected_x))*data[q];*/
    hdata[q]=(1- (corrected_y-floor(corrected_y)))*(1-(corrected_x-floor(corrected_x)))*(undistor_img.at<uchar>(floor(corrected_y),floor(corrected_x)))+(1-( corrected_y-floor(corrected_y)))*(corrected_x-floor(corrected_x))*(undistor_img.at<uchar>(floor(corrected_y), ceil(corrected_x)))+(corrected_y-floor(corrected_y))*(1-(corrected_x-floor(corrected_x)))*(undistor_img.at<uchar>(ceil(corrected_y),floor(corrected_x)))+(corrected_y-floor(corrected_y))*(corrected_x-floor(corrected_x))*(undistor_img.at<uchar>(ceil(corrected_y), ceil(corrected_x)));   
    a++;}
    else{
    b++;
    hdata[q]= undistor_img.at<uchar>(p,q);
    }
    }

}
//cout<<"if was read"<<a <<"times"<<endl;
//cout<<"else was read"<<b <<"times"<<endl;
imshow("bird's eye view image",birdeyeview_img);
//cout<<"input size="<<undistor_img.rows<<"X"<<undistor_img.cols<<endl;
//cout<<"result size="<<birdeyeview_img.rows<<"X"<<birdeyeview_img.cols<<endl;
cvWaitKey();
}

我还可以通过其他方式使用其他图像(undistor_img)的像素值更改像素值(在birdeyeview_img中)?

最佳答案

对于这个特定问题,可能有几个问题,我只能提供其中几个:

  • birdeyeview_imgundistor_img未初始化
  • 坐标pqcoor_xcoor_y超出了实际图像大小
  • (可能性最小),图像深度与您用于访问
  • 的深度不同

    因此,您首先需要检查您的问题不是上述问题之一。

    关于opencv - 像素处理中的段错误(核心已转储),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17140425/

    相关文章:

    python - openCV:尝试理解从相机代码捕获视频

    字符指针赋值段错误

    linux - LD_PRELOAD 在动态库加载器中导致段错误

    c++ - 使用反转计数算法的段故障

    macos - 在 Mac 10.12 (Sierra) 上安装 Caffe 时出错 "symbol(s) not found for architecture x86_64"

    Python 将 True False 矩阵转换为图像

    c++ - 使用opencv进行功能检测失败并出现seg错误

    c++ - MFC - 如何绘制彩色位图到对话框DC

    c - 我在创建乘法表程序时遇到段错误

    c++尝试反向打印数组时出现段错误