2016-12-13 3 views
0

현재 Open CV 3.1을 사용하여 Visual Studio 2013의 이미지 처리 학교 프로젝트를 만들고 있습니다. 내 목표는 (지금은) 사다리꼴 보드가 직사각형으로 변형되도록 affine transform을 사용하여 이미지를 변환하는 것입니다.C++에서 Affine 변환

이렇게하려면 특정 채널을 빼고 이미지의 임계 값을 지정하여 보드의 모서리에 흰색 블록이있는 이진 이미지가 생기도록하십시오. 이제 각 모서리에 가장 가까운 흰색 점 4 개를 선택하고 (아핀 변환을 사용하여) 변환 된 이미지의 모서리로 설정합니다.

그리고 Open 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

그건 사다리꼴 보드에 의한 것입니다.그리고 저는 아핀 변환이 충분하지 않을 수도 있다고 생각하지만이 변환을이 연습에 사용해야합니다. –