void HSV_Region_Processor_Min_Alloc::findRegion(cv::Mat &frame, int i, int j, double ®X, double ®Y, double ®Size) { pointList->append(i,j); long sumX = 0, sumY = 0; regSize = 0; while(pointList->size() != 0) { int tempX = pointList->getX(); int tempY = pointList->getY(); cv::Vec3b &point = frame.ptr<cv::Vec3b>(tempX)[tempY]; if (isBlue(point)) { sumX += tempX; sumY += tempY; regSize++; point=black; if (tempX != frame.rows-1) {pointList->append(tempX+1, tempY);}; if (tempX != 0 ) {pointList->append(tempX-1, tempY);}; if (tempY != frame.cols-1) {pointList->append(tempX, tempY+1);}; if (tempY != 0 ) {pointList->append(tempX, tempY-1);}; } pointList->pop(); } if (regSize > 1) { regX = sumX/regSize; regY = sumY/regSize; } else { regX = -1; regY = -1; regSize = -1; } }
QString CardOCR::suit(const QImage * img_wb, const QImage * img) { if ((img_wb->width() != img->width()) || (img_wb->height() != img->height())) return QString(); const int w = img->width(); const int h = img->height(); QRgb clMinValue; qreal minVal = 1.0; for (int x = 0; x < w; ++x) { for (int y = 0; y < h; ++y) { QRgb rgb_wb = img_wb->pixel(x, y); //рассматриваем только черные точки if (rgb_wb == qRgb(0, 0, 0)) { QRgb rgb = img->pixel(x, y); QColor cl(rgb); if (cl.valueF() < minVal) { minVal = cl.valueF(); clMinValue = rgb; //qDebug() << x << y; } } } } if (isRed(clMinValue)) return "h"; else if (isBlue(clMinValue)) return "d"; else if (isGreen(clMinValue)) return "c"; else return "s"; return QString(); }
void CamCapture::showSegmentation() { CvScalar pixel; for (int x = 0; x < width_var; ++x) { for (int y = 0; y < height_var; ++y) { if(isRed(x,y)) { setPixel3C(pixel,0,0,255); } else if(isBlue(x, y)) { setPixel3C(pixel,255,0,0); } else if(isYellow(x, y)) { setPixel3C(pixel,0,255,255); } else if(isGreen(x, y)) { setPixel3C(pixel,0,255,0); } else if(isWhite(x, y)) { setPixel3C(pixel, 255, 255, 255); } else if(isBlack(x, y)) { setPixel3C(pixel, 127, 127, 127); } else { setPixel3C(pixel,0,0,0); } cvSet2D(showSeg, y, x, pixel); } } }
std::vector<Region *>* HSV_Region_Processor_Min_Alloc::processFrame(cv::Mat &frame) { cv::Mat hsvFrame; cv::cvtColor(frame, hsvFrame, cv::COLOR_BGR2HSV); double regX=0, regY=0, regSize=0; for (int i = 0; i<hsvFrame.rows; i++) { const cv::Vec3b* row = hsvFrame.ptr<cv::Vec3b>(i); for (int j = 0; j<hsvFrame.cols; j++) { if (isBlue(row[j])) { findRegion(hsvFrame, i, j, regX, regY, regSize); if (regSize != -1) { regionList->push_back(new Region(regX, regY, regSize, BLUE, BLOB)); } } } } return regionList; }
bool PathFindingApp::update(yam2d::ESContext* ctx, float deltaTime) { if (!m_appRunning) return false; if (deltaTime > 0.1f) deltaTime = 0.1f; #if defined(_WIN32) if( isKeyReleased(yam2d::KEY_SPACE) ) { quit(); } // Restart search if r pressed if (isKeyReleased(yam2d::KEY_R)) { m_textureStartCase = 0; m_texturePathFound = 0; } #endif if (m_textureStartCase == 0) { // Delete old and load new m_texturePathFound = 0; const char* const inFileName = "input.png"; char buf[100]; sprintf_s(buf, "Start finding path from input image: \"%s\"", inFileName); yam2d::esLogMessage(buf); m_text->setText(buf); m_textureStartCase = new yam2d::Texture(inFileName, true); // Copy input data to map. m_searchTimer = 0.0f; int width = m_textureStartCase->getWidth(); int height = m_textureStartCase->getHeight(); int bpp = m_textureStartCase->getBytesPerPixel(); yam2d::Ref<yam2d::StreamTexture> newTexture = new yam2d::StreamTexture(); newTexture->setData(m_textureStartCase->getData(), width, height, bpp); m_texturePathFound = newTexture; m_searchCompleted = false; } if (!m_searchCompleted) { // Find start and end int startX, startY, endX, endY; startX = startY = endX = endY = -1; for (int y = 0; y < m_textureStartCase->getHeight(); ++y) { for (int x = 0; x < m_textureStartCase->getWidth(); ++x) { unsigned char* p = m_textureStartCase->getPixel(x, y); if (isRed(p)) { // Red pixel startX = x; startY = y; } else if (isGreen(p)) { // Green pixel } else if (isBlue(p)) { // Blue pixel endX = x; endY = y; } } } // Update path find!! Set m_searchCompleted to true, when path found, so the texture data is updated. if (startX >= 0 && startY >= 0 && endX >= 0 && endY >= 0) { yam2d::ElapsedTimer timer; timer.reset(); m_searchCompleted = doPathfinding(startX, startY, endX, endY); m_searchTimer += timer.getTime(); // Update new data to the GPU m_texturePathFound->updateData(); } else { assert(0); } if (m_searchCompleted) { char buf[100]; sprintf_s(buf, "Path find done. Time spent %.3f seconds", m_searchTimer); yam2d::esLogMessage("%s\n",buf); m_text->setText(buf); } } // if (!m_searchCompleted) // Clear sprite before add new dynamic sprites. m_batch->clear(); // Add sprites. m_batch->addSprite(m_textureStartCase, m_spriteStartCase, yam2d::vec2(-256.0f - 20.0f, 0.0f), 0.0f, yam2d::vec2(512.0f, 512.0f)); m_batch->addSprite(m_texturePathFound, m_spritePathFound, yam2d::vec2(256.0f + 20.0f, 0.0f), 0.0f, yam2d::vec2(512.0f, 512.0f)); // Add text to position -400,300 m_batch->addText(m_fontTexture, m_text, yam2d::vec2(0, ((float)ctx->height) / 2.0f - 20.0f), 0.0f); return true; }
void ColorSeqDetector::input(IplImage *inputImg) { if(!img) { img = cvCreateImage(cvGetSize(inputImg), IPL_DEPTH_32F, 1); cvZero(img); } if(!stateImg) { stateImg = cvCreateImage(cvGetSize(inputImg), IPL_DEPTH_8U, 3); cvZero(stateImg); } else if(img->width != inputImg->width || img->height != inputImg->height) { cvReleaseImage(&img); img = cvCreateImage(cvGetSize(inputImg), IPL_DEPTH_32F, 1); cvReleaseImage(&stateImg); stateImg = cvCreateImage(cvGetSize(inputImg), IPL_DEPTH_8U, 3); cvZero(stateImg); cvZero(img); } uchar *data; int step; CvSize(size); uchar *state_data; int state_step; float *float_data; int float_step; cvGetRawData(inputImg, (uchar**)&data, &step, &size); step /= sizeof(data[0]); cvGetRawData(img, (uchar**)&float_data, &float_step, &size); float_step /= sizeof(float_data[0]); cvGetRawData(stateImg, (uchar**)&state_data, &state_step, &size); state_step /= sizeof(state_data[0]); for(int y = 0; y < size.height; y++, data += step, state_data+=state_step, float_data+=float_step ) for(int x = 0; x < size.width; x++ ) { uchar h = data[3*x]; uchar s = data[3*x+1]; uchar v = data[3*x+2]; uchar state = state_data[3*x]; uchar sstate = state_data[3*x+1]; uchar bstate = state_data[3*x+1]; float score = float_data[x]; switch(state){ case 0: // invalid state if(isRed(h,s,v)) { state = 1; sstate = 0; bstate = 0; } break; case 1: // red state if(isRed(h,s,v)) { sstate++; if(sstate > period+2) { sstate = 0; state = 0; } }else if(sstate >= period-2 && isGreen(h,s,v)) { state = 2; sstate = 0; bstate = 0; }else{ bstate ++; if(bstate > 1) { state = 0; sstate = 0; } } break; case 2: // green state if(isGreen(h,s,v)) { sstate++; if(sstate > period+2) { sstate = 0; state = 0; } }else if(sstate >= period - 2 && isBlue(h,s,v)) { state = 3; sstate = 0; bstate = 0; }else{ bstate ++; if(bstate > 1) { state = 0; sstate = 0; } } break; case 3: // blue state if(isBlue(h,s,v)) { sstate++; if(sstate > period+2) { sstate = 0; state = 0; } }else if(sstate >= period-2 && isYellow(h,s,v)) { state = 4; sstate = 0; bstate = 0; }else{ bstate ++; if(bstate > 1) { state = 0; sstate = 0; } } break; case 4: // yellow state if(isYellow(h,s,v)) { sstate++; if(sstate > period+2) { sstate = 0; state = 0; } }else if(sstate >= period-2 && isRed(h,s,v)) { state = 1; sstate = 0; bstate = 0; score = 1.; //float_data[x]=1.; }else{ bstate ++; if(bstate > 1) { state = 0; sstate = 0; } } break; default: state = 0; sstate = 0; break; } state_data[3*x] = state; state_data[3*x+1] = sstate; //float_data[x] = (float) state / 4.f; score -= 0.005; if(score < 0. ) { score = 0.; } float_data[x] = score; // if(state == 0){ // float_data[x] = 0.; // } } emitNamedEvent("output", img); }