int ImageConverter::pickOutSimpleColors (IplImage *inframe, IplImage *outframe) { int x=0; int y=0; int ctype; uchar H; uchar S; uchar V; IplImage *hsv = cvCreateImage (cvGetSize (inframe), IPL_DEPTH_8U, 3); cvCopyImage (inframe, outframe); cvCvtColor (outframe, hsv, CV_BGR2HSV); // FIXME: Can i use OpenMP here? for (y=0; y<hsv->height; y++) { for (x=0; x<hsv->width; x++) { // получаем HSV-компоненты пикселя H = CV_PIXEL(uchar, hsv, x, y)[0]; // Hue S = CV_PIXEL(uchar, hsv, x, y)[1]; // Saturation V = CV_PIXEL(uchar, hsv, x, y)[2]; // Value (Brightness) // определяем к какому цвету можно отнести данные значения ctype = getPixelColorType (H, S, V); // устанавливаем этот цвет у отладочной картинки CV_PIXEL(uchar, outframe, x, y)[0] = cCTHue[ctype]; // Hue CV_PIXEL(uchar, outframe, x, y)[1] = cCTSat[ctype]; // Saturation CV_PIXEL(uchar, outframe, x, y)[2] = cCTVal[ctype]; // Value } } cvCvtColor (outframe, outframe, CV_HSV2BGR); cvReleaseImage (&hsv); return 0; }
int calc_hsv_colors(IplImage *frame) { if(!frame) return -1; IplImage* image=0, *hsv=0, *dst=0, *dst2=0, *color_indexes=0, *dst3=0; image = cvCloneImage(frame); hsv = cvCreateImage( cvGetSize(image), IPL_DEPTH_8U, 3 ); cvCvtColor( image, hsv, CV_BGR2HSV ); // for store results dst = cvCreateImage( cvGetSize(image), IPL_DEPTH_8U, 3 ); dst2 = cvCreateImage( cvGetSize(image), IPL_DEPTH_8U, 3 ); color_indexes = cvCreateImage( cvGetSize(image), IPL_DEPTH_8U, 1 ); // store color indexes // для хранения RGB-х цветов CvScalar rgb_colors[NUM_COLOR_TYPES]; int i=0, j=0, x=0, y=0; // reset colors memset(colorCount, 0, sizeof(colorCount)); for(i=0; i<NUM_COLOR_TYPES; i++) { rgb_colors[i] = cvScalarAll(0); } for (y=0; y<hsv->height; y++) { for (x=0; x<hsv->width; x++) { // get HSV pixel uchar H = CV_PIXEL(uchar, hsv, x, y)[0]; // Hue uchar S = CV_PIXEL(uchar, hsv, x, y)[1]; // Saturation uchar V = CV_PIXEL(uchar, hsv, x, y)[2]; // Value (Brightness) // define pixel color type int ctype = getPixelColorType(H, S, V); // set values CV_PIXEL(uchar, dst, x, y)[0] = cCTHue[ctype]; // Hue CV_PIXEL(uchar, dst, x, y)[1] = cCTSat[ctype]; // Saturation CV_PIXEL(uchar, dst, x, y)[2] = cCTVal[ctype]; // Value // collect RGB rgb_colors[ctype].val[0] += CV_PIXEL(uchar, image, x, y)[0]; // B rgb_colors[ctype].val[1] += CV_PIXEL(uchar, image, x, y)[1]; // G rgb_colors[ctype].val[2] += CV_PIXEL(uchar, image, x, y)[2]; // R // сохраняем к какому типу относится цвет CV_PIXEL(uchar, color_indexes, x, y)[0] = ctype; // подсчитываем :) colorCount[ctype]++; } } // усреднение RGB-составляющих for(i=0; i<NUM_COLOR_TYPES; i++) { rgb_colors[i].val[0] /= colorCount[i]; rgb_colors[i].val[1] /= colorCount[i]; rgb_colors[i].val[2] /= colorCount[i]; } // теперь загоним массив в вектор и отсортируем :) std::vector< std::pair< int, uint > > colors; colors.reserve(NUM_COLOR_TYPES); for(i=0; i<NUM_COLOR_TYPES; i++){ std::pair< int, uint > color; color.first = i; color.second = colorCount[i]; colors.push_back( color ); } // сортируем std::sort( colors.begin(), colors.end(), colors_sort ); // для отладки - выводим коды, названия цветов и их количество for(i=0; i<colors.size(); i++){ printf("[i] color %d (%s) - %d\n", colors[i].first, sCTypes[colors[i].first], colors[i].second ); } // выдаём код первых цветов printf("[i] color code: \n"); for(i=0; i<NUM_COLOR_TYPES; i++) printf("%02d ", colors[i].first); printf("\n"); printf("[i] color names: \n"); for(i=0; i<NUM_COLOR_TYPES; i++) printf("%s ", sCTypes[colors[i].first]); printf("\n"); #if 0 cvSaveImage("image.bmp", image); #endif cvReleaseImage(&image); cvReleaseImage(&hsv); cvReleaseImage(&dst); cvReleaseImage(&dst2); cvReleaseImage(&color_indexes); cvReleaseImage(&dst3); return 0; }
int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgs, int nWinMode) { // переменные для хранения изображений IplImage *frame = 0, *image = 0, *hsv = 0, *dst = 0, *dst2 = 0, *color_indexes = 0, *dst3 = 0, *image2 = 0, *tmp = 0; int key = 0, zx = 0, zy = 0; // загружаем картинку из файла IplImage *menu = cvLoadImage("menu.png"); // создаем главное окно проекта cvNamedWindow("Проект OpenCV"); cvShowImage("Проект OpenCV",menu); cvMoveWindow("Проект OpenCV",100,50); // получаем любую подключенную Web-камеру CvCapture *capture = cvCaptureFromCAM(CV_CAP_ANY); // частота кадров double fps = 18; // инициализация записи видео в файл; 4-буквенный код кодека для обработки видео, формируется макросом CV_FOURCC CvVideoWriter *writer = cvCreateVideoWriter("record.avi", CV_FOURCC('I','Y','U','V'), fps, cvSize(640, 480), 1); if (!capture) return 0; else { while(key != 27) { // получаем текущий кадр frame = cvQueryFrame(capture); // копируем его для обработки image = cvCloneImage(frame); // зум if(key=='+') { zx = zx + 4; zy = zy + 3; } if(key=='-') { zx = zx - 4; zy = zy - 3; } if(zx > 300) { zx = 300; zy = 225; } if(zx < 0) { zx = 0; zy = 0; } // задаем ширину и высоту ROI int zwidth = frame->width-2*zx; int zheight = frame->height-2*zy; // устанавливаем ROI (Region Of Interest — интересующая область изображения) cvSetImageROI(frame, cvRect(zx,zy,zwidth,zheight)); // копируем интересующую область в переменную image2 image2 = cvCloneImage(frame); // создаем пустое изображение размером 640x480 tmp = cvCreateImage( cvSize(640, 480), frame->depth, frame->nChannels ); // размещаем ROI на пустое изображение tmp cvResize(image2, tmp, 0); // сохраняем кадр в видео-файл cvWriteFrame(writer, tmp); // сбрасываем ROI cvResetImageROI(frame); // инициализация шрифта CvFont font; cvInitFont( &font, CV_FONT_HERSHEY_COMPLEX,1.0, 1.0, 0, 1, CV_AA); // используя шрифт выводим на картинку текст cvPutText(tmp, "press '+' to increase", cvPoint(150, 40), &font, CV_RGB(150, 0, 150) ); cvPutText(tmp, "press '-' to reduce", cvPoint(165, 450), &font, CV_RGB(150, 0, 150) ); // число пикселей данного цвета на изображении uint colorCount[NUM_COLOR_TYPES] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; hsv = cvCreateImage( cvGetSize(image), IPL_DEPTH_8U, 3 ); cvCvtColor( image, hsv, CV_BGR2HSV ); // картинки для хранения результатов dst = cvCreateImage( cvGetSize(image), IPL_DEPTH_8U, 3 ); dst2 = cvCreateImage( cvGetSize(image), IPL_DEPTH_8U, 3 ); color_indexes = cvCreateImage( cvGetSize(image), IPL_DEPTH_8U, 1 ); //для хранения индексов цвета // для хранения RGB цветов CvScalar rgb_colors[NUM_COLOR_TYPES]; int i=0, j=0, x=0, y=0; // обнуляем цвета for(i=0; i<NUM_COLOR_TYPES; i++) { rgb_colors[i] = cvScalarAll(0); } for (y=0; y<hsv->height; y++) { for (x=0; x<hsv->width; x++) { // получаем HSV-компоненты пикселя uchar H = CV_PIXEL(uchar, hsv, x, y)[0]; // Hue uchar S = CV_PIXEL(uchar, hsv, x, y)[1]; // Saturation uchar V = CV_PIXEL(uchar, hsv, x, y)[2]; // Value (Brightness) // определяем к какому цвету можно отнести данные значения int ctype = getPixelColorType(H, S, V); // устанавливаем этот цвет у отладочной картинки CV_PIXEL(uchar, dst, x, y)[0] = cCTHue[ctype]; // Hue CV_PIXEL(uchar, dst, x, y)[1] = cCTSat[ctype]; // Saturation CV_PIXEL(uchar, dst, x, y)[2] = cCTVal[ctype]; // Value // собираем RGB-составляющие rgb_colors[ctype].val[0] += CV_PIXEL(uchar, image, x, y)[0]; // B rgb_colors[ctype].val[1] += CV_PIXEL(uchar, image, x, y)[1]; // G rgb_colors[ctype].val[2] += CV_PIXEL(uchar, image, x, y)[2]; // R // сохраняем к какому типу относится цвет CV_PIXEL(uchar, color_indexes, x, y)[0] = ctype; // подсчитываем colorCount[ctype]++; } } // усреднение RGB-составляющих for(i=0; i<NUM_COLOR_TYPES; i++) { rgb_colors[i].val[0] /= colorCount[i]; rgb_colors[i].val[1] /= colorCount[i]; rgb_colors[i].val[2] /= colorCount[i]; } // теперь загоним массив в вектор и отсортируем std::vector< std::pair< int, uint > > colors; colors.reserve(NUM_COLOR_TYPES); for(i=0; i<NUM_COLOR_TYPES; i++){ std::pair< int, uint > color; color.first = i; color.second = colorCount[i]; colors.push_back( color ); } // сортируем std::sort( colors.begin(), colors.end(), colors_sort ); // покажем цвета cvZero(dst2); int h = dst2->height; int w = dst2->width / RECT_COLORS_SIZE; for(i=0; i<RECT_COLORS_SIZE; i++ ){ cvRectangle(dst2, cvPoint(i*w, 0), cvPoint(i*w+w, h), rgb_colors[colors[i].first], -1); } // покажем картинку в найденных цветах dst3 = cvCloneImage(image); for (y=0; y<dst3->height; y++) { for (x=0; x<dst3->width; x++) { int color_index = CV_PIXEL(uchar, color_indexes, x, y)[0]; CV_PIXEL(uchar, dst3, x, y)[0] = rgb_colors[color_index].val[0]; CV_PIXEL(uchar, dst3, x, y)[1] = rgb_colors[color_index].val[1]; CV_PIXEL(uchar, dst3, x, y)[2] = rgb_colors[color_index].val[2]; } } // конвертируем отладочную картинку обратно в RGB cvCvtColor( dst, dst, CV_HSV2BGR ); cvSetMouseCallback("Проект OpenCV", ClickOnMenu, (void*) menu); if(flag_1 == 1) { cvNamedWindow("Веб-камера", CV_WINDOW_AUTOSIZE); cvShowImage("Веб-камера", image); } else cvDestroyWindow("Веб-камера"); if(flag_2 == 1) { cvNamedWindow("Zoom", CV_WINDOW_AUTOSIZE); cvShowImage("Zoom", tmp); } else cvDestroyWindow("Zoom"); if(flag_3 == 1) { cvNamedWindow("Обнаруженные цвета"); cvShowImage("Обнаруженные цвета", dst2); } else cvDestroyWindow("Обнаруженные цвета"); if(flag_4 == 1) { cvNamedWindow("Изображение в обнаруженных цветах"); cvShowImage("Изображение в обнаруженных цветах", dst3); } else cvDestroyWindow("Изображение в обнаруженных цветах"); if(flag_5 == 1) { cvNamedWindow("Из HSV в RGB"); cvShowImage("Из HSV в RGB", dst); } else cvDestroyWindow("Из HSV в RGB"); // освобождаем ресурсы cvReleaseImage(&hsv); cvReleaseImage(&dst); cvReleaseImage(&dst2); cvReleaseImage(&color_indexes); cvReleaseImage(&dst3); cvReleaseImage(&image); cvReleaseImage(&image2); cvReleaseImage(&tmp); if(flag_exit == 1) { cvReleaseCapture(&capture); cvReleaseVideoWriter(&writer); // закрываем видео-файл return 0; } // если нажали ESC - выходим из цикла key = cvWaitKey(1); } // освобождаем инициализированные ранее переменные cvReleaseCapture(&capture); cvReleaseVideoWriter(&writer); } return 0; }
void image_reflect_vertical(image *_src) { if(!_src) return; int x, y, i, j; CVTYPE_DEPTH_8U tmp; int h2 = _src->height/2; for (y = 0, j=_src->height-1; y < h2; y++, j--) { for (x = 0, i=0; x < _src->width; x++, i++) { tmp = CV_PIXEL(CVTYPE_DEPTH_8U,_src,x,y)[0]; CV_PIXEL(CVTYPE_DEPTH_8U,_src,x,y)[0] = CV_PIXEL(CVTYPE_DEPTH_8U,_src,i,j)[0]; CV_PIXEL(CVTYPE_DEPTH_8U,_src,i,j)[0] = tmp; if(_src->n_channels == 3) { tmp = CV_PIXEL(CVTYPE_DEPTH_8U,_src,x,y)[1]; CV_PIXEL(CVTYPE_DEPTH_8U,_src,x,y)[1] = CV_PIXEL(CVTYPE_DEPTH_8U,_src,i,j)[1]; CV_PIXEL(CVTYPE_DEPTH_8U,_src,i,j)[1] = tmp; tmp = CV_PIXEL(CVTYPE_DEPTH_8U,_src,x,y)[2]; CV_PIXEL(CVTYPE_DEPTH_8U,_src,x,y)[2] = CV_PIXEL(CVTYPE_DEPTH_8U,_src,i,j)[2]; CV_PIXEL(CVTYPE_DEPTH_8U,_src,i,j)[2] = tmp; } } } }