2016-12-13 84 views
0

私は現在、Open CV 3.1を使用してVisual Studio 2013で画像処理に関する学校のプロジェクトを行っています。私の目標(今のところ)は、アフィン変換を使って画像を変換することで、台形板が矩形に変換されます。C++のアフィン変換

これを行うには、特定のチャネルを差し引いてイメージをスレッショルドにして、ボードのコーナーに白いブロックを持つバイナリイメージを作成します。 これで、各コーナーに最も近い4つの白色点を選び、(アフィン変換を使用して)それらを変換された画像の隅として設定する必要があります。

オープンCVを初めて使用しているので、私は立ち往生しています。あなたが見ることができるように

#include <iostream> 
#include <opencv2\core.hpp> 
#include <opencv2\highgui.hpp> 
#include<opencv2/imgproc.hpp> 
#include <stdlib.h> 
#include <stdio.h> 
#include <vector> 


int main(){ 

    double dist; 
    cv::Mat image; 
    image = cv::imread("C:\\Users\\...\\ideal.png"); 

    cv::Mat imagebin; 
    imagebin = cv::imread("C:\\Users\\...\\ideal.png"); 

    cv::Mat imageerode; 

    //cv::imshow("Test", image); 

    cv::Mat src = cv::imread("C:\\Users\\...\\ideal.png"); 
    std::vector<cv::Mat>img_rgb; 
    cv::split(src, img_rgb); 

    //cv::imshow("ideal.png", img_rgb[2] - img_rgb[1]); 

    cv::threshold(img_rgb[2] - 0.5*img_rgb[1], imagebin , 20, 255, CV_THRESH_BINARY); 
    cv::erode(imagebin, imageerode, cv::Mat(), cv::Point(1, 1), 2, 1, 1); 
    cv::erode(imageerode, imageerode, cv::Mat(), cv::Point(1, 1), 2, 1, 1); 

    // cv::Point2f array[4]; 
    // std::vector<cv::Point2f> array; 

    for (int i = 0; i < imageerode.cols; i++) 
    { 
     for (int j = 0; j < imageerode.rows; j++) 
     { 
      if (imageerode.at<uchar>(i,j) > 0) 
      { 
       dist = std::min(dist, i + j); 
      } 
     } 
    } 

    //cv::imshow("Test binary", imagebin); 
    cv::namedWindow("Test", CV_WINDOW_NORMAL); 
    cv::imshow("Test", imageerode); 
    cv::waitKey(0); 

    std::cout << "Hello world!"; 
    return 0; 
} 

は、私にはわからないどのように各白画素を超えるループimage.atを使用し、各コーナーまでの距離を保存するには:

は、ここに私のコードです。

私はいくつかの助けに感謝します。

また、私はこれをしたくありません。私は本当にそれをする方法を学びたい。しかし、私は現在、心境があります。私は4点の座標を見つけることで行われていると思う

はあなたに

EDITありがとうございます。しかし、私は実際にwarpAffineの構文を知ることはできません。

コード:それはそれが得ることができる最大値ですので、私はimageerode.cols + imageerode.rowsまでの距離値のすべてを設定

for (int i = 0; i < imageerode.cols; i++) 
{ 
    for (int j = 0; j < imageerode.rows; j++) 
    { 
     if (imageerode.at<uchar>(i, j) > 0) 
     { 

      if (i + j < distances[0]) 
      { 
       distances[0] = i + j; 
       coordinates[0] = i; 
       coordinates[1] = j; 
      } 

      if (i + imageerode.cols-j < distances[1]) 
      { 
       distances[1] = i + imageerode.cols-j; 
       coordinates[2] = i; 
       coordinates[3] = j; 
      } 

      if (imageerode.rows-i + j < distances[2]) 
      { 
       distances[2] = imageerode.rows - i + j; 
       coordinates[4] = i; 
       coordinates[5] = j; 
      } 

      if (imageerode.rows-i + imageerode.cols-j < distances[3]) 
      { 
       distances[3] = imageerode.rows - i + imageerode.cols - j; 
       coordinates[6] = i; 
       coordinates[7] = j; 
      } 

     } 
    } 

。 また、taxicabジオメトリを使用しています。私はそれが速いと言われ、結果はほぼ同じです。

warpAffineで誰かが私を助けることができたら、それは素晴らしいことです。私は見つけた座標をどこに置くのか分かりません。

は、私はあなたの「台形ボードは」のように見えるが、それは視点を持っている場合は、カメラを持つ矩形をキャプチャするときのように変換し、その後、アフィン変換は十分ではありませんかわからないあなたに

+0

try ['findContours'](http://docs.opencv.org/2.4/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html?highlight=findcontours#findcontours) – slawekwin

+0

代わりにコーナーを見つけるのはどうですか?境界ピクセル(隣接する白いピクセルを持つ黒)であるすべてのピクセルを繰り返し、隣人の境界ピクセルがターンをするかどうかを調べます(つまり、シャープなターン、180に近いターンを検出するきれいな方法はないでしょう°)。次に、コーナーにして、最も近い白いピクセルを簡単に見つけることができます。または、コーナーで直接作業してください。 – Aziuth

+0

学校のビジュアルc ....クールだ(たぶん) –

答えて

0

ありがとうございます。透視変換を使用します。私はFeatures2D + Homography to find a known objectがあなたがしたいことに非常に近いと思います。

+0

それはまさに台形板の意味です。そして、私はアフィン変換が十分ではないかもしれないと思いますが、私はこのエクササイズにこの非常にトランスフォームを使用しなければなりません。 –