[122] | 1 | // created: 2014/07/17
|
---|
| 2 | // filename: CvtColor.cpp
|
---|
| 3 | //
|
---|
| 4 | // author: Guillaume Sanahuja
|
---|
| 5 | // Copyright Heudiasyc UMR UTC/CNRS 7253
|
---|
| 6 | //
|
---|
| 7 | // version: $Id: $
|
---|
| 8 | //
|
---|
| 9 | // purpose: Image color conversion
|
---|
| 10 | //
|
---|
| 11 | //
|
---|
| 12 | /*********************************************************************/
|
---|
| 13 |
|
---|
| 14 | #include "CvtColor.h"
|
---|
[338] | 15 | #include "VisionFilter.h"
|
---|
| 16 | #include <Image.h>
|
---|
[122] | 17 | #include <typeinfo>
|
---|
| 18 |
|
---|
| 19 | using std::string;
|
---|
| 20 | using namespace flair::core;
|
---|
| 21 |
|
---|
[338] | 22 | class CvtColor_impl {
|
---|
| 23 | public:
|
---|
| 24 | CvtColor_impl(flair::filter::CvtColor *self,flair::filter::CvtColor::Conversion_t conversion):output(0) {
|
---|
| 25 | this->conversion=conversion;
|
---|
| 26 | this->self=self;
|
---|
[122] | 27 |
|
---|
[338] | 28 | switch(conversion) {
|
---|
| 29 | case flair::filter::CvtColor::Conversion_t::ToGray:
|
---|
| 30 | try{
|
---|
| 31 | Image::Type const &imageType=dynamic_cast<Image::Type const &>(((IODevice*)(self->Parent()))->GetOutputDataType());
|
---|
| 32 | output=new Image(self,imageType.GetWidth(),imageType.GetHeight(),Image::Type::Format::Gray,"conversion",true,2);
|
---|
| 33 | //inIplImage = (IplImage*)AllocFunction(sizeof(IplImage));
|
---|
| 34 | //outIplImage = (IplImage*)AllocFunction(sizeof(IplImage));
|
---|
| 35 | } catch(std::bad_cast& bc) {
|
---|
| 36 | self->Err("io type mismatch\n");
|
---|
| 37 | }
|
---|
| 38 | break;
|
---|
| 39 | default:
|
---|
| 40 | self->Err("conversion not supported\n");
|
---|
| 41 | }
|
---|
| 42 | }
|
---|
[122] | 43 |
|
---|
[338] | 44 | ~CvtColor_impl() {
|
---|
| 45 | //FreeFunction((char*)(inIplImage));
|
---|
| 46 | //FreeFunction((char*)(outIplImage));
|
---|
| 47 | }
|
---|
| 48 |
|
---|
| 49 | void UpdateFrom(const io_data *data){
|
---|
| 50 | Image *img=(Image*)data;
|
---|
[122] | 51 |
|
---|
[338] | 52 | if(output!=NULL) {
|
---|
| 53 | data->GetMutex();/*
|
---|
| 54 | inIplImage->width=img->GetDataType().GetWidth();
|
---|
| 55 | inIplImage->height=img->GetDataType().GetHeight();
|
---|
| 56 | inIplImage->imageData=img->buffer;
|
---|
| 57 | inIplImage->imageSize=img->GetDataType().GetSize();
|
---|
| 58 | */
|
---|
| 59 | output->GetMutex();/*
|
---|
| 60 | outIplImage->width=output->GetDataType().GetWidth();
|
---|
| 61 | outIplImage->height=output->GetDataType().GetHeight();
|
---|
| 62 | outIplImage->imageData=output->buffer;
|
---|
| 63 | outIplImage->imageSize=output->GetDataType().GetSize();
|
---|
| 64 | */
|
---|
| 65 | switch(conversion) {
|
---|
| 66 | case flair::filter::CvtColor::Conversion_t::ToGray:
|
---|
| 67 | switch(((Image*)data)->GetDataType().GetFormat()) {
|
---|
| 68 | case Image::Type::Format::YUYV:
|
---|
| 69 | //dspCvtColor(inIplImage,outIplImage,DSP_YUYV2GRAY);
|
---|
| 70 | break;
|
---|
| 71 | case Image::Type::Format::UYVY:
|
---|
| 72 | //dspCvtColor(inIplImage,outIplImage,DSP_UYVY2GRAY);
|
---|
| 73 | break;
|
---|
| 74 | case Image::Type::Format::BGR:
|
---|
| 75 | //dspCvtColor(inIplImage,outIplImage,DSP_BGR2GRAY);
|
---|
| 76 | break;
|
---|
| 77 | default:
|
---|
| 78 | self->Err("input format not supported\n");
|
---|
| 79 | }
|
---|
| 80 | break;
|
---|
| 81 | default:
|
---|
| 82 | self->Err("conversion not supported\n");
|
---|
| 83 | }
|
---|
| 84 |
|
---|
| 85 | output->ReleaseMutex();
|
---|
| 86 | data->ReleaseMutex();
|
---|
| 87 |
|
---|
| 88 | output->SetDataTime(data->DataTime());
|
---|
[122] | 89 | }
|
---|
[338] | 90 | };
|
---|
[157] | 91 |
|
---|
[338] | 92 | Image *output;
|
---|
| 93 |
|
---|
| 94 | private:
|
---|
| 95 | flair::filter::CvtColor::Conversion_t conversion;
|
---|
| 96 | //IplImage *inIplImage,*outIplImage;
|
---|
| 97 | flair::filter::CvtColor *self;
|
---|
| 98 | };
|
---|
| 99 |
|
---|
| 100 |
|
---|
| 101 | namespace flair { namespace filter {
|
---|
| 102 |
|
---|
| 103 | CvtColor::CvtColor(const core::IODevice* parent,std::string name,Conversion_t conversion) : IODevice(parent,name) {
|
---|
| 104 | pimpl_=new CvtColor_impl(this,conversion);
|
---|
[122] | 105 | }
|
---|
| 106 |
|
---|
[338] | 107 | CvtColor::~CvtColor(void) {
|
---|
| 108 | delete pimpl_;
|
---|
| 109 | }
|
---|
[122] | 110 |
|
---|
[338] | 111 | Image* CvtColor::Output(void) {
|
---|
| 112 | return pimpl_->output;
|
---|
[122] | 113 |
|
---|
| 114 | }
|
---|
| 115 |
|
---|
| 116 | DataType const &CvtColor::GetOutputDataType() const {
|
---|
[338] | 117 | if(pimpl_->output!=NULL) {
|
---|
| 118 | return pimpl_->output->GetDataType();
|
---|
[122] | 119 | } else {
|
---|
| 120 | return dummyType;
|
---|
| 121 | }
|
---|
| 122 | }
|
---|
| 123 |
|
---|
| 124 | void CvtColor::UpdateFrom(const io_data *data) {
|
---|
[338] | 125 | pimpl_->UpdateFrom(data);
|
---|
| 126 | if(pimpl_->output!=NULL) ProcessUpdate(pimpl_->output);
|
---|
| 127 |
|
---|
[122] | 128 | }
|
---|
| 129 |
|
---|
| 130 | } // end namespace filter
|
---|
| 131 | } // end namespace flair
|
---|