像素操作中的分割错误(核心转储) [英] Segmentation Fault (core dumped) in pixel manipulation

查看:49
本文介绍了像素操作中的分割错误(核心转储)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am trying to get the bird's eye view of an image. I am altering the pixel intensity in two for-loops going over row and column respectively.

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

我得到:分段错误(核心转储).如何更改像素强度,而不会出现此类错误?我的未失真图像是灰度图像.现在我做了一些更改,它运行但没有给出正确的结果,只有一部分代码显示像素操作://

I am getting: Segmentation Fault (Core Dumped). How do I alter the pixel intensity, without getting nay such error? My undistorted image is a grayscale image. Now I made few changes, it runs but doesn't give proper result, only a part of the code shows pixel manipulations : //

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();
}

我还可以通过哪些其他方式更改像素值(在birdeyeview_img 中),使用来自另一张图像 (undistor_img) 的像素值?

In what other ways can I change pixel values(in birdeyeview_img) , using the pixel values from another image (undistor_img) ?

推荐答案

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

For this particular issue may be several issues, I can provide only couple of them:

  1. birdeyeview_imgundistor_img 未初始化
  2. 坐标pqcoor_xcoor_y 超出实际图像尺寸
  3. (最不可能)图像深度与您用于访问的深度不符
  1. birdeyeview_img or undistor_img are not initialized
  2. The coordinates p, q, coor_x or coor_y are exceeding the actual image size
  3. (Least probable) the image depth is not according the depth that you using to access

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

So, you need the first of all to check that yours issue is not one of the above.

这篇关于像素操作中的分割错误(核心转储)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆