2016-11-11 6 views
0

これは、円筒形のカメラから長方形のウィンドウを使って撮影した画像です。我々が得する画像は、円形でなければならないが、長方形の画像である。私はOpenCVを使用して、イメージをピクセル単位で、指定された長方形の画像から1行ずつ円に移動します。問題は、ピクセルの分布が半径によって不均一であることです。より均等に流通させるためにどのようなアルゴリズムを提案しますか?ここでは、コードです:OpenCVでピクセル単位で画像を整形する

int main(int argc, char** argv) { 


Mat src = imread("srcImg.jpg", 1); 
Mat dst = imread("dstImg.jpg", 1); 

int srcH = src.rows; int srcW = src.cols; 
int dstH = dst.rows; int dstW = src.cols; 

//convert chamber radius to pixels 
double alpha, alpha_double, alpha_triple; 
int r = 1500; 
double k = 210/(500 * PI); 
int l = 1; 
//take pixels from source and arrange them into circles 

    for (int i = srcH - 1; i > 0; i--) { 
     for (int j = 1; j <= srcW ; j++) { 
      alpha = (double) (2 * PI * (r * k + i))/j; 
      alpha_double = (double) (2 * PI * ((r + 15) * k + i))/j; 
      alpha_triple = alpha_double = (double) (2 * PI * ((r + 30) * k + i))/j; 

      int x_new = abs((int) (dstW/2 - (r * k + i) * cos(alpha)) - 200); 
      int y_new = abs((int) (dstH/2 - (3.5*(r * k + i) * sin(alpha))) + 1000); 

      int x_new_double = abs((int) (dstW/2 - (r * k + i) * cos(alpha_double)) - 200); 
      int y_new_double = abs((int) (dstH/2 - (3.5*(r * k + i) * sin(alpha_double))) + 1000); 

      int x_new_triple = abs((int) (dstW/2 - (r * k + i) * cos(alpha_triple)) - 200); 
      int y_new_triple = abs((int) (dstH/2 - (3.5*(r * k + i) * sin(alpha_triple))) + 1000); 

      dst.at<uchar>(x_new, y_new) = src.at<uchar>(srcH - i, srcW - j); 
      dst.at<uchar>(x_new_double, y_new_double) = src.at<uchar>(srcH - i, srcW - j); 
      dst.at<uchar>(x_new_triple, y_new_triple) = src.at<uchar>(srcH - i, srcW - j); 
     } 
    } 

//make dst image grey and show all images 
Mat dstGray; 
cvtColor(dst, dstGray, CV_RGB2GRAY); 
imshow("Source", src); 
imshow("Result", dstGray); 

waitKey(); 
return 0; 

、これはほとんど完全な答えではありませんresult

+0

達成したい循環的な結果はもう少し説明できますか?同様に、なぜ、何がポイントで、何を期待しているのですか? – Eric

+2

通常、あなたはその逆を行います。ターゲットイメージ内のすべてのピクセルについて、ソースイメージ内の値を計算する必要があります。サブピクセルの位置を計算すると、あなたの心の欲求に補間技術を適用することもできます。 – PeterT

+0

@エリック円筒形のカメラとその周りを走る爆発波があります。小さな矩形の窓を通してビデオに取り込み、ビデオのフレームを1つのピクチャに接続して、カメラ内のすべての瞬間の長いイメージを取得します。私たちが得する画像は長方形ですが、波が入っているカメラは円ですので、波形を正しく表現できるように、指定した半径の円に合わせるために長方形の画像を作成する必要があります。単純にピクセルのすべての線を取り、円を描く必要があります。私は元の画像をリンクしてより明確になるようにします[リンク](https://s3.postimg.org/6gdezqppf/src_Img.jpg) –

答えて

0

、私は手動ですべてのピクセルにアクセスするのではなく、プロジェクションマッピングのいくつかの種類をしようとするだろう。目的のシェイプを作成するためのopenCVの方法が必要です。「オリジナルの画像を取得して目的のシェイプに合わせる」

これは、長方形の場合はyou can see hereというよりも簡単ですが、

+1

_そこにはopenCVの方法がなければなりません!あなた自身でコード化しない限り、 – Miki

+0

2つの文を使って詳細に科学実験を説明するのはかなり難しいですが、感謝します。 –

関連する問題