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;
^
. datatype
을 short
(이 아닌)으로 바꾸면 매우 비슷한 오류가 나타납니다. 테스트 목적으로 만 사용하십시오. 변수 this->workingImage
은 일반적으로 예상대로 함수 내에서 볼 수 있습니다 (그리고 내가 protected
안에 ImageProcessor
으로 선언 한 변수를 사용할 수 있습니다). 본문을 변경하면 함수 호출이 정상적으로 통과합니다.
OpenCV의 템플릿 액세스 기능 (예 : at
등의 begin
및 end
)을 사용하는 경우에만 오류가 발생합니다. 내가 GOAL: AVOIDING THIS
에 의해 표시 줄의 주석 경우
더욱 호기심, 그들은 컴파일하고 완벽하게 실행합니다. 그러나이 구조의 전체적인 점은이를 피하고 템플릿 기반 Derived 클래스를 사용하여 데이터 형식 종속 함수 또는 데이터 형식 고유 함수를 구현하는 것입니다.
참고 :이 예에서 지원되는 이미지 유형 및 기능은 이 아니며입니다. 지금은 두 가지 유형의 이미지 만 있지만 향후 변경 될 수 있습니다. 또한 프로세싱 함수는 때로는 동일하지만 (다른 데이터 유형을 지정할 필요성을 제외하고), 때로는 데이터/이미지 유형에 공통적 인 부분과 부분을 가질 수 있습니다 (예 : 전처리는 모든 요소를 루핑해야합니다. 최소 및 최대 값 (일반)을 입력 한 다음 누락 된 값을 모두 보간합니다 (내 float
및 short
이미지에 대한 다른 접근 방식). 일부 기능은 Base 클래스에 직접 캡슐화됩니다 (이미지의 너비/높이를 가져 오는 등 데이터 사양이 필요하지 않은 경우).
코드를 수정하거나 원하는 기능을 수행하는 방법을 아는 사람이 있습니까?
OpenCV 데이터에 액세스하는 방법을 알고있는 것이 목표라면 지나치게 복잡하다고 생각합니다. 원하는 특정 문제 풀다? – Miki
@Miki 이미지는 다양한 레이더 반응 (높이, 강도 등)입니다. 일부 예제 기능 : 전처리 (데이터를 통한 공통 부분 반복, 누락 된 요소에 대한 보간은 이미지의 유형, 높이 및 강도가 다르게 보간됨에 따라 다름). 이미지 (따라서 인간을 해석 할 수있는) 표시 : 모든 이미지 0-255로 정규화 한 후, 데이터의 종류에 따라 동일한 선형 눈금으로 표시되며 대수 다른 사람들 (예를 들어 강도 이미지는 거의 높은 점수를 가지고). 그런 다음 'RadarResponseHeight'을 구축 ... 예에서와 같이 최대 나는 간단한 방법으로 할 것이다 – penelope
를 (단지 DIFF 입력), 몇 가지 일반적인 부분이 될 것'RadarResponseIntensity' 등 ... 클래스로'구조체 RadarResponseXXX {Mat1f 매트; ...} '또는 귀하의 데이터가 무엇인지 알 수 있습니다. 그럼 당신은 그냥'minMaxLoc'을 사용할 수 있습니다 (즉, 최대 요소를 찾을 수)이 경우의 문제에 관해서는, 단순히 데이터 유형 ... – Miki