2016-06-08 1 views
1

OpenCV를 사용하여 나를 위해 일부 이미지를 처리 ​​할 응용 프로그램을 만들고 있습니다. 다른 유형의 이미지 (사용자가 지정한 유형)를 처리 할 수 ​​있어야합니다.OpenCV 템플릿 코드는 파생 클래스 내에서 컴파일 오류를 생성합니다.

대부분의 처리는 동일한 방식이며 데이터를 정확하게 참조하기 위해 cv::Mat.at<type>()과 같은 기능에 사용 된 cv:Mat에있는 데이터 유형에 따라 달라집니다. 이를 위해 공용 구현체, 유형을 알아야하는 함수의 가상 인터페이스 및 팩토리 메서드가 들어있는 Base 클래스 ImageProcessor을 만들었습니다. 필자는 데이터 액세스 방법을 구현할 수 있도록 템플릿 기반 Derived TypedProcessor<datatype> 클래스를 작성했습니다.

그러나, 나는 내가 파생 된 클래스 내에서 OpenCV의 템플릿 액세스 기능을 사용할 때마다 이상한 컴파일 오류를 얻고있다. 여기에 최소 (비) 작업 예이다 : 나는 점점 오전

#include <iostream> 

#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/imgproc/imgproc.hpp> 
#include <opencv2/core/core.hpp> 

class ImageProcessor{ 
    public: 
     static ImageProcessor *NewProcessor(char option, std::string imgPath); 
     virtual ~ImageProcessor() {} 
     virtual void printMaxElem() = 0; 
    protected: 
     ImageProcessor(const std::string &imgPath) : workingImagePath(imgPath) { 
      this->workingImage = cv::imread(imgPath.c_str(), CV_LOAD_IMAGE_ANYDEPTH); 
     } 
     cv::Mat workingImage; 
     std::string workingImagePath; 
}; 


template <typename datatype> 
class TypedProcessor : public ImageProcessor{ 
    public: 
     TypedProcessor(std::string imgPath) : ImageProcessor(imgPath) {} 
     virtual ~TypedProcessor() {} 

     void printMaxElem(); 
     void preprocess(); 
    private: 
     void calculateDisplayValue(); 
}; 

template <typename datatype> 
void TypedProcessor<datatype>::printMaxElem(){ 
    std::cerr << (datatype)(*std::max_element(this->workingImage.begin<datatype>(), this->workingImage.end<datatype>())) << std::endl; 
} 

ImageProcessor* ImageProcessor::NewProcessor(char option, std::string imgPath){ 
    ImageProcessor *processor = NULL; 
    switch (option){ 
     case 'h': // input correctly as CV_32F 
      processor = new TypedProcessor<float>(imgPath); 
      // GOAL: AVOIDING THIS: 
      //std::cerr << (float)(*std::max_element(processor->workingImage.begin<float>(), processor->workingImage.end<float>())) << std::endl; 
      break; 
     case 'i': // input as CV_16U but should be interpreted as CV_16S 
      processor = new TypedProcessor<short>(imgPath); 
      processor->workingImage.flags = (processor->workingImage.flags & ~CV_MAT_TYPE_MASK) | CV_16S; 
      // GOAL: AVOIDING THIS: 
      //std::cerr << (short)(*std::max_element(processor->workingImage.begin<short>(), processor->workingImage.end<short>())) << std::endl; 
      break; 
     default: 
      break; 
    } 

    processor->printMaxElem(); 

    return processor; 
} 


int main(void){ 
    ImageProcessor *myprocessor = ImageProcessor::NewProcessor('h', "user/will/input/this"); 
    return 0; 
} 

오류는 다음과 같습니다 나는 또한 this->workingImage.end<datatype>()에 대한 해당 오류를 얻을

In member function ‘void TypedProcessor<datatype>::printMaxElem()’: 
test.cpp:35:84: error: expected primary-expression before ‘>’ token 
     std::cerr << (datatype)(*std::max_element(this->workingImage.begin<datatype>(), this->workingImage.end<datatype>())) << std::endl; 
                        ^
test.cpp:35:86: error: expected primary-expression before ‘)’ token 
    std::cerr << (datatype)(*std::max_element(this->workingImage.begin<datatype>(), this->workingImage.end<datatype>())) << std::endl; 
                       ^

. datatypeshort (이 아닌)으로 바꾸면 매우 비슷한 오류가 나타납니다. 테스트 목적으로 만 사용하십시오. 변수 this->workingImage은 일반적으로 예상대로 함수 내에서 볼 수 있습니다 (그리고 내가 protected 안에 ImageProcessor으로 선언 한 변수를 사용할 수 있습니다). 본문을 변경하면 함수 호출이 정상적으로 통과합니다.

OpenCV의 템플릿 액세스 기능 (예 : at 등의 beginend)을 사용하는 경우에만 오류가 발생합니다. 내가 GOAL: AVOIDING THIS에 의해 표시 줄의 주석 경우

더욱 호기심, 그들은 컴파일하고 완벽하게 실행합니다. 그러나이 구조의 전체적인 점은이를 피하고 템플릿 기반 Derived 클래스를 사용하여 데이터 형식 종속 함수 또는 데이터 형식 고유 함수를 구현하는 것입니다.

참고 :이 예에서 지원되는 이미지 유형 및 기능은 이 아니며입니다. 지금은 두 가지 유형의 이미지 만 있지만 향후 변경 될 수 있습니다. 또한 프로세싱 함수는 때로는 동일하지만 (다른 데이터 유형을 지정할 필요성을 제외하고), 때로는 데이터/이미지 유형에 공통적 인 부분과 부분을 가질 수 있습니다 (예 : 전처리는 모든 요소를 ​​루핑해야합니다. 최소 및 최대 값 (일반)을 입력 한 다음 누락 된 값을 모두 보간합니다 (내 floatshort 이미지에 대한 다른 접근 방식). 일부 기능은 Base 클래스에 직접 캡슐화됩니다 (이미지의 너비/높이를 가져 오는 등 데이터 사양이 필요하지 않은 경우).

코드를 수정하거나 원하는 기능을 수행하는 방법을 아는 사람이 있습니까?

+0

OpenCV 데이터에 액세스하는 방법을 알고있는 것이 목표라면 지나치게 복잡하다고 생각합니다. 원하는 특정 문제 풀다? – Miki

+0

@Miki 이미지는 다양한 레이더 반응 (높이, 강도 등)입니다. 일부 예제 기능 : 전처리 (데이터를 통한 공통 부분 반복, 누락 된 요소에 대한 보간은 이미지의 유형, 높이 및 강도가 다르게 보간됨에 따라 다름). 이미지 (따라서 인간을 해석 할 수있는) 표시 : 모든 이미지 0-255로 정규화 한 후, 데이터의 종류에 따라 동일한 선형 눈금으로 표시되며 대수 다른 사람들 (예를 들어 강도 이미지는 거의 높은 점수를 가지고). 그런 다음 'RadarResponseHeight'을 구축 ... 예에서와 같이 최대 나는 간단한 방법으로 할 것이다 – penelope

+0

를 (단지 DIFF 입력), 몇 가지 일반적인 부분이 될 것'RadarResponseIntensity' 등 ... 클래스로'구조체 RadarResponseXXX {Mat1f 매트; ...} '또는 귀하의 데이터가 무엇인지 알 수 있습니다. 그럼 당신은 그냥'minMaxLoc'을 사용할 수 있습니다 (즉, 최대 요소를 찾을 수)이 경우의 문제에 관해서는, 단순히 데이터 유형 ... – Miki

답변

1

어, 모두들, 제가 옳은 문제를 찾는 법을 알지 못했던 것 같습니다.

작은 예에 대한 설명은 this answer 제공된다. 분명히, 나는 함수 호출에 접두어를 붙이고 template을 붙일 필요가 있고 그것은 매력처럼 작동한다.따라서 문제의 함수는 다음과 같이 다시 써야합니다.

template <typename datatype> 
void TypedProcessor<datatype>::printMaxElem(){ 
    std::cerr << (datatype)(*std::max_element(this->workingImage.template begin<datatype>(), this->workingImage.template end<datatype>())) << std::endl; 
} 
관련 문제