void cOpenCV<T>::write(const cData3<T>& object, const std::string& fileName, eNorm8bit norm8bit) const { const std::string funcName("void cOpenCV::write(" "const cData3<T>& object, " "const std::string& fileName, " "eNorm8bit norm8bit) const"); require(object.getAddrData() != NULL, funcName + ": writing an empty object to an OpenCV file"); require(object.getDimension() == 2, funcName + ": writing a non-image object to an OpenCV file"); cv::Mat cvData((int) object.getNrow(), (int) object.getNcol(), CV_8U); cData3<T> dataSave; switch (norm8bit) { case NORM8BIT_TRUE: dataSave = object; dataSave.normalize8bit(); #pragma omp parallel for for(size_t i = 0; i < object.getNelement(); i++) { cvData.data[i] = (uint8_t) dataSave[i]; } break; case NORM8BIT_FALSE: #pragma omp parallel for for(size_t i = 0; i < object.getNelement(); i++) { cvData.data[i] = (uint8_t) object[i]; } break; default: ERROR(funcName, "unsupported norm8bit mode"); } cv::imwrite(fileName.c_str(), cvData); }
MStatus cvColor::compute( const MPlug& plug, MDataBlock& data ) { MStatus stat; // cout << "cvColor::compute\n"; if ( plug == cvLocations ) { MDataHandle inputData = data.inputValue ( inputSurface, &stat ); if (!stat) { stat.perror("cvColor::compute get inputSurface"); return stat; } MObject surf = inputData.asNurbsSurface(); MFnNurbsSurface surfFn (surf, &stat); if (!stat) { stat.perror("cvColor::compute surface creator"); return stat; } MDataHandle outputData = data.outputValue ( cvLocations, &stat ); if (!stat) { stat.perror("cvColor::compute get cvLocations"); return stat; } MObject cvs = outputData.data(); MFnPointArrayData cvData(cvs, &stat); if (!stat) { stat.perror("cvColor::compute point array data creator"); return stat; } MPointArray cvArray; stat = surfFn.getCVs( cvArray, MSpace::kObject); if (!stat) { stat.perror("cvColor::compute getCVs"); return stat; } stat = cvData.set ( cvArray ); if (!stat) { stat.perror("cvColor::compute setCVs"); return stat; } outputData.set ( cvs ); stat = data.setClean ( plug ); if (!stat) { stat.perror("cvColor::compute setClean"); return stat; } } else { return MS::kUnknownParameter; } return MS::kSuccess; }
void cOpenCV<T>::putText(const cData3<T>& object, const std::string& fileName, const std::string& textStr, eColorName textColor, T scale, eNorm8bit norm8bit) { const std::string funcName("void cOpenCV::putText(" "const cData3<T>& object, " "const std::string& fileName, " "const std::string& textStr, " "eColorName textColor, " "T scale, eNorm8bit norm8bit)"); require(object.getAddrData() != NULL, funcName + ": writing an empty object to an OpenCV file"); require(object.getDimension() == 2, funcName + ": writing a non-image object to an OpenCV file"); require(textStr.length() != 0, funcName + ": putting an empty text string onto an OpenCV image"); cv::Mat cvData ((int) object.getNrow(), (int) object.getNcol(), CV_8U ); cv::Mat cvDataColor((int) object.getNrow(), (int) object.getNcol(), CV_8UC3); cData3<T> dataSave; switch (norm8bit) { case NORM8BIT_TRUE: dataSave = object; dataSave.normalize8bit(); #pragma omp parallel for for(size_t i = 0; i < object.getNelement(); i++) { cvData.data[i] = (uint8_t) dataSave[i]; } cvtColor(cvData, cvDataColor, cv::COLOR_GRAY2RGB); break; case NORM8BIT_FALSE: #pragma omp parallel for for(size_t i = 0; i < object.getNelement(); i++) { cvData.data[i] = (uint8_t) object[i]; } cvtColor(cvData, cvDataColor, cv::COLOR_GRAY2RGB); break; default: ERROR(funcName, "unsupported norm8bit mode"); } switch (textColor) { case COLOR_WHITE: cv::putText(cvDataColor, textStr, cv::Point(0,(int)(30*scale)), cv::FONT_HERSHEY_SIMPLEX, scale, cv::Scalar(255,255,255), (int)(2*scale), cv::LINE_AA); break; case COLOR_BLACK: cv::putText(cvDataColor, textStr, cv::Point(0,(int)(30*scale)), cv::FONT_HERSHEY_SIMPLEX, scale, cv::Scalar( 0, 0, 0), (int)(2*scale), cv::LINE_AA); break; case COLOR_RED: cv::putText(cvDataColor, textStr, cv::Point(0,(int)(30*scale)), cv::FONT_HERSHEY_SIMPLEX, scale, cv::Scalar( 0, 0,255), (int)(2*scale), cv::LINE_AA); break; case COLOR_GREEN: cv::putText(cvDataColor, textStr, cv::Point(0,(int)(30*scale)), cv::FONT_HERSHEY_SIMPLEX, scale, cv::Scalar( 0,255, 0), (int)(2*scale), cv::LINE_AA); break; case COLOR_BLUE: cv::putText(cvDataColor, textStr, cv::Point(0,(int)(30*scale)), cv::FONT_HERSHEY_SIMPLEX, scale, cv::Scalar(255, 0, 0), (int)(2*scale), cv::LINE_AA); break; case COLOR_CYAN: cv::putText(cvDataColor, textStr, cv::Point(0,(int)(30*scale)), cv::FONT_HERSHEY_SIMPLEX, scale, cv::Scalar(255,255, 0), (int)(2*scale), cv::LINE_AA); break; case COLOR_MAGNETA: cv::putText(cvDataColor, textStr, cv::Point(0,(int)(30*scale)), cv::FONT_HERSHEY_SIMPLEX, scale, cv::Scalar(255, 0,255), (int)(2*scale), cv::LINE_AA); break; case COLOR_YELLOW: cv::putText(cvDataColor, textStr, cv::Point(0,(int)(30*scale)), cv::FONT_HERSHEY_SIMPLEX, scale, cv::Scalar( 0,255,255), (int)(2*scale), cv::LINE_AA); break; default: ERROR(funcName, "unsupported color mode"); } cv::imwrite(fileName.c_str(), cvDataColor); }
void cvColor::draw( M3dView & view, const MDagPath & path, M3dView::DisplayStyle style, M3dView::DisplayStatus status ) { // cout << "cvColor::draw\n"; MStatus stat; MObject thisNode = thisMObject(); MPlug enPlug( thisNode, drawingEnabled ); bool doDrawing; stat = enPlug.getValue ( doDrawing ); if (!stat) { stat.perror("cvColor::draw get drawingEnabled"); return; } if (!doDrawing) return; MPlug szPlug( thisNode, pointSize ); float ptSize; stat = szPlug.getValue ( ptSize ); if (!stat) { stat.perror("cvColor::draw get pointSize"); ptSize = 4.0; } MPlug cvPlug( thisNode, cvLocations ); MObject cvObject; stat = cvPlug.getValue(cvObject); if (!stat) { stat.perror("cvColor::draw get cvObject"); return; } MFnPointArrayData cvData(cvObject, &stat); if (!stat) { stat.perror("cvColor::draw get point array data"); return; } MPointArray cvs = cvData.array( &stat ); if (!stat) { stat.perror("cvColor::draw get point array"); return; } // Extract the 'worldMatrix' attribute that is inherited from 'dagNode' // MFnDependencyNode fnThisNode( thisNode ); MObject worldSpaceAttribute = fnThisNode.attribute( "worldMatrix" ); MPlug matrixPlug( thisNode, worldSpaceAttribute); // 'worldMatrix' is an array so we must specify which element the plug // refers to matrixPlug = matrixPlug.elementByLogicalIndex (0); // Get the value of the 'worldMatrix' attribute // MObject matObject; stat = matrixPlug.getValue(matObject); if (!stat) { stat.perror("cvColor::draw get matObject"); return; } MFnMatrixData matrixData(matObject, &stat); if (!stat) { stat.perror("cvColor::draw get world matrix data"); return; } MMatrix worldSpace = matrixData.matrix( &stat ); if (!stat) { stat.perror("cvColor::draw get world matrix"); return; } if ( view.isColorIndexMode() ) { cerr << "Can't update cv colors in color index mode\n"; return; } view.beginGL(); // Push the color settings // glPushAttrib( GL_CURRENT_BIT | GL_POINT_BIT ); glPointSize( ptSize ); glDisable ( GL_POINT_SMOOTH ); // Draw square "points" glBegin( GL_POINTS ); int numCVs = cvs.length(); for (int i = 0; i < numCVs; i++) { // cout << "cv[" << i << "]: " << cvs[i] << ": "; MPoint cv( cvs[i] ); MColor cvColor; cv *= worldSpace; if (cv.x < 0 && cv.y < 0) { // cout << "Red"; cvColor.r = 1.0; cvColor.g = 0.0; cvColor.b = 0.0; } else if (cv.x < 0 && cv.y >= 0) { // cout << "Cyan"; cvColor.r = 0.0; cvColor.g = 1.0; cvColor.b = 1.0; } else if (cv.x >= 0 && cv.y < 0) { // cout << "Blue"; cvColor.r = 0.0; cvColor.g = 0.0; cvColor.b = 1.0; } else if (cv.x >= 0 && cv.y >= 0) { // cout << "Yellow"; cvColor.r = 1.0; cvColor.g = 1.0; cvColor.b = 0.0; } // cout << endl; view.setDrawColor ( cvColor ); glVertex3f( (float)cvs[i].x, (float)cvs[i].y, (float)cvs[i].z); } glEnd(); glPopAttrib(); view.endGL(); }