问题
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();
}
In what other ways can I change pixel values(in birdeyeview_img) , using the pixel values from another image (undistor_img) ?
回答1:
For this particular issue may be several issues, I can provide only couple of them:
birdeyeview_imgorundistor_imgare not initialized- The coordinates
p,q,coor_xorcoor_yare exceeding the actual image size - (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.
来源:https://stackoverflow.com/questions/17140425/segmentation-fault-core-dumped-in-pixel-manipulation