我试图获得鸟瞰图像。我正在改变分别在行和列上的两个 for-loops 中的像素强度。
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中)?
答案 0 :(得分:1)
对于这个特殊问题可能有几个问题,我只能提供几个问题:
birdeyeview_img
或undistor_img
未初始化p
,q
,coor_x
或coor_y
超出实际图像尺寸因此,您需要首先检查您的问题是否不是上述问题之一。