0

画像の鳥瞰図を取得しようとしています。行と列にそれぞれ渡される 2 つの 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) を変更するには、他にどのような方法がありますか?

4

1 に答える 1

1

この特定の問題にはいくつかの問題がある可能性がありますが、そのうちのいくつかしか提供できません。

  1. birdeyeview_imgまたはundistor_img初期化されていない
  2. 座標pqcoor_xまたはcoor_yが実際の画像サイズを超えています
  3. (可能性が最も低い)画像の深さは、アクセスに使用する深さに応じていません

したがって、まず最初に、あなたの問題が上記のいずれでもないことを確認する必要があります。

于 2013-06-17T06:33:58.390 に答える