//-------------------------------------------------------------------------------- void ofxCvShortImage::operator = ( const ofxCvColorImage& _mom ) { // cast non-const, no worries, we will reverse any chages ofxCvColorImage& mom = const_cast<ofxCvColorImage&>(_mom); if( mom.getWidth() == 0 || mom.getHeight() == 0 ){ ofLog(OF_LOG_ERROR, "in =, mom width or height is 0"); return; } if( !bAllocated ){ ofLog(OF_LOG_NOTICE, "in =, allocating to match dimensions"); allocate(mom.getWidth(), mom.getHeight()); } if( matchingROI(getROI(), mom.getROI()) ) { if( cvGrayscaleImage == NULL ) { cvGrayscaleImage = cvCreateImage( cvSize(width,height), IPL_DEPTH_8U, 1 ); } ofRectangle roi = getROI(); setImageROI(cvGrayscaleImage, roi); cvCvtColor( mom.getCvImage(), cvGrayscaleImage, CV_RGB2GRAY ); convertGrayToShort(cvGrayscaleImage, cvImage); setImageROI(cvGrayscaleImage, roi); flagImageChanged(); } else { ofLog(OF_LOG_ERROR, "in =, ROI mismatch"); } }
//-------------------------------------------------------------------------------- void ofxCvFloatImage::setRoiFromPixels( const unsigned char* _pixels, int w, int h ) { if( w == 0 || h == 0 ){ ofLog(OF_LOG_ERROR, "in setFromPixels, w and h cannot = 0"); return; } if(!bAllocated){ ofLog(OF_LOG_ERROR, "in setRoiFromPixels, image is not allocated"); return; } ofRectangle roi = getROI(); ofRectangle inputROI = ofRectangle( roi.x, roi.y, w, h); ofRectangle iRoi = getIntersectionROI( roi, inputROI ); if( iRoi.width > 0 && iRoi.height > 0 ) { if( cvGrayscaleImage == NULL ) { cvGrayscaleImage = cvCreateImage( cvSize(width,height), IPL_DEPTH_8U, 1 ); } setImageROI(cvGrayscaleImage, roi); //make sure ROI is in sync // copy _pixels into cvGrayscaleImage for( int i=0; i < iRoi.height; i++ ) { memcpy( cvGrayscaleImage->imageData + ((i+(int)iRoi.y)*cvGrayscaleImage->widthStep) + (int)iRoi.x, _pixels + (i*w), (int)(iRoi.width) ); } convertGrayToFloat(cvGrayscaleImage, cvImage); flagImageChanged(); } else { ofLog(OF_LOG_ERROR, "in setRoiFromPixels, ROI mismatch"); } }
//-------------------------------------------------------------------------------- void ofxCvColorImage::operator = ( const ofxCvShortImage& _mom ) { // cast non-const, no worries, we will reverse any chages ofxCvShortImage& mom = const_cast<ofxCvShortImage&>(_mom); if( mom.getWidth() == 0 || mom.getHeight() == 0 ){ ofLogError("ofxCvColorImage") << "operator=: source width and/or height are zero:" << mom.getWidth() << " " << mom.getHeight(); return; } if( !bAllocated ){ ofLogNotice("ofxCvColorImage") << "operator=: allocating to match dimensions: " << mom.getWidth() << " " << mom.getHeight(); allocate(mom.getWidth(), mom.getHeight()); } if( matchingROI(getROI(), mom.getROI()) ) { if( cvGrayscaleImage == NULL ) { cvGrayscaleImage = cvCreateImage( cvSize(width,height), IPL_DEPTH_8U, 1 ); } ofRectangle roi = getROI(); setImageROI(cvGrayscaleImage, roi); rangeMap( mom.getCvImage(), cvGrayscaleImage, 0, 65535.0f, 0, 255.0f ); cvCvtColor( cvGrayscaleImage, cvImage, CV_GRAY2RGB ); flagImageChanged(); } else { ofLogError("ofxCvColorImage") << "operator=: region of interest mismatch"; } }
//-------------------------------------------------------------------------------- unsigned char* ofxCvFloatImage::getRoiPixels(){ if(bPixelsDirty) { if( cvGrayscaleImage == NULL ) { cvGrayscaleImage = cvCreateImage( cvSize(width,height), IPL_DEPTH_8U, 1 ); } ofRectangle roi = getROI(); setImageROI(cvGrayscaleImage, roi); //make sure ROI is in sync convertFloatToGray(cvImage, cvGrayscaleImage); if(pixels == NULL) { // we need pixels, allocate it pixels = new unsigned char[(int)(roi.width*roi.height)]; pixelsWidth = roi.width; pixelsHeight = roi.height; } else if(pixelsWidth != roi.width || pixelsHeight != roi.height) { // ROI changed, reallocate pixels for new size delete pixels; pixels = new unsigned char[(int)(roi.width*roi.height)]; pixelsWidth = roi.width; pixelsHeight = roi.height; } // copy from ROI to pixels for( int i = 0; i < roi.height; i++ ) { memcpy( pixels + (int)(i*roi.width), cvGrayscaleImage->imageData + ((int)(i+roi.y)*cvGrayscaleImage->widthStep) + (int)roi.x, roi.width ); } bPixelsDirty = false; } return pixels; }
//-------------------------------------------------------------------------------- IplImage* ofxCvFloatImage::getCv8BitsRoiImage() { if( !bAllocated ){ ofLog(OF_LOG_WARNING, "in getCv8BitsRoiImage, image is not allocated"); } if(bPixelsDirty) { if( cvGrayscaleImage == NULL ) { cvGrayscaleImage = cvCreateImage( cvSize(width,height), IPL_DEPTH_8U, 1 ); } ofRectangle roi = getROI(); setImageROI(cvGrayscaleImage, roi); //make sure ROI is in sync convertFloatToGray(cvImage, cvGrayscaleImage); } return cvGrayscaleImage; }
//-------------------------------------------------------------------------------- void ofxCvColorImage::operator = ( const ofxCvShortImage& _mom ) { // cast non-const, no worries, we will reverse any chages ofxCvShortImage& mom = const_cast<ofxCvShortImage&>(_mom); if( matchingROI(getROI(), mom.getROI()) ) { if( cvGrayscaleImage == NULL ) { cvGrayscaleImage = cvCreateImage( cvSize(width,height), IPL_DEPTH_8U, 1 ); } ofRectangle roi = getROI(); setImageROI(cvGrayscaleImage, roi); rangeMap( mom.getCvImage(), cvGrayscaleImage, 0, 65535.0f, 0, 255.0f ); cvCvtColor( cvGrayscaleImage, cvImage, CV_GRAY2RGB ); flagImageChanged(); } else { ofLog(OF_LOG_ERROR, "in =, ROI mismatch"); } }