outl4w 0 Жалоба Опубликовано May 30, 2011 Доброе время суток! Возникла такая проблемка, при выполнении следующего кода (вычитание фона из изображения и затем его морфологические преобразования), получаю результат, как на приложенном изображении. Видно, что красный канал в принципе отсутствует. И это вне зависимости от изображений, которых я передаю приложению. Причём, по-началу всё работало нормально (присутствовали только эти дурацкие вертикальные полоски, о которых я скажу чуть похже), потом однажды хоп, и пропал канал. Давай всяко-разно крутить-вертеть... Сейчас получается такая ситуация, что пропадает именно тот канал, к которому первым применяется функция cvThreshold, и именно с параметром CV_THRESH_BINARY или CV_THRESH_BINARY_INV! С остальными параметрам (CV_THRESH_TRUNC, CV_THRESH_TOZERO и т.д.) ничего никуда не пропадает. Посоветуйте, пожалуйста, в какую сторону копать, где сбой происходит, а то я всю голову сломал уже А что касается полосок... У меня они присутствовали сразу, тоже долго с ними боролся, пока случайно не запустил своё приложение на другом компьютере. Там их не оказалось! Подозреваю, что это отзыв к видеокарте или другому какому-нибудь железу. Но если кто-нибудь сталкивался с такой проблемой, буду очень рад услышать советы. Заранее спасибо! Листинг: #include "stdafx.h" #include <cv.h> #include <highgui.h> int main( int argc, char** argv ) { if(argc < 3) return -1; IplImage* in = cvLoadImage(argv[1],CV_LOAD_IMAGE_ANYCOLOR); IplImage* r = cvCreateImage(cvGetSize(in), IPL_DEPTH_8U, 1); // R channel IplImage* g = cvCreateImage(cvGetSize(in), IPL_DEPTH_8U, 1); // G channel IplImage* b = cvCreateImage(cvGetSize(in), IPL_DEPTH_8U, 1); // B channel IplImage* fon = cvLoadImage(argv[2],CV_LOAD_IMAGE_ANYCOLOR); IplImage* r_fon = cvCreateImage(cvGetSize(fon), IPL_DEPTH_8U, 1); // R channel IplImage* g_fon = cvCreateImage(cvGetSize(fon), IPL_DEPTH_8U, 1); // G channel IplImage* b_fon = cvCreateImage(cvGetSize(fon), IPL_DEPTH_8U, 1); // B channel IplImage* r_dst = cvCreateImage(cvGetSize(in), IPL_DEPTH_8U, 1); // R channel IplImage* g_dst = cvCreateImage(cvGetSize(in), IPL_DEPTH_8U, 1); // G channel IplImage* b_dst = cvCreateImage(cvGetSize(in), IPL_DEPTH_8U, 1); // B channel cvZero(r); cvZero(g); cvZero(; cvZero(r_fon); cvZero(g_fon); cvZero(b_fon); cvZero(r_dst); cvZero(g_dst); cvZero(b_dst); cvSplit(in, r, g, b, NULL); cvSplit(fon, r_fon, g_fon, b_fon, NULL); cvAbsDiff(g,g_fon,r_dst); cvAbsDiff(g,g_fon,g_dst); cvAbsDiff(b,b_fon,b_dst); cvThreshold(r_dst,r_dst,50,255,CV_THRESH_BINARY); cvThreshold(g_dst,g_dst,50,255,CV_THRESH_BINARY); cvThreshold(b_dst,b_dst,50,255,CV_THRESH_BINARY); cvErode(r_dst,r_dst,NULL,1); cvErode(g_dst,g_dst,NULL,1); cvErode(b_dst,b_dst,NULL,1); cvDilate(r_dst,r_dst,NULL,1); cvDilate(g_dst,g_dst,NULL,1); cvDilate(b_dst,b_dst,NULL,1); cvShowImage("R",r_dst); cvShowImage("G",g_dst); cvShowImage("B",b_dst); cvWaitKey(0); cvReleaseImage(&in); cvReleaseImage(&r); cvReleaseImage(&g); cvReleaseImage(&; cvReleaseImage(&fon); cvReleaseImage(&r_fon); cvReleaseImage(&g_fon); cvReleaseImage(&b_fon); cvReleaseImage(&r_dst); cvReleaseImage(&g_dst); cvReleaseImage(&b_dst); cvDestroyAllWindows(); return 0; }[/code] Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано May 30, 2011 А если так? IplImage* in = cvLoadImage(argv[1],CV_LOAD_IMAGE_ANYCOLOR); IplImage* r = cvCreateImage(cvGetSize(in), IPL_DEPTH_8U, 1); // R channel IplImage* g = cvCreateImage(cvGetSize(in), IPL_DEPTH_8U, 1); // G channel IplImage* b = cvCreateImage(cvGetSize(in), IPL_DEPTH_8U, 1); // B channel IplImage* fon = cvLoadImage(argv[2],CV_LOAD_IMAGE_ANYCOLOR); IplImage* r_fon = cvCreateImage(cvGetSize(fon), IPL_DEPTH_8U, 1); // R channel IplImage* g_fon = cvCreateImage(cvGetSize(fon), IPL_DEPTH_8U, 1); // G channel IplImage* b_fon = cvCreateImage(cvGetSize(fon), IPL_DEPTH_8U, 1); // B channel IplImage* r_dst = cvCreateImage(cvGetSize(in), IPL_DEPTH_8U, 1); // R channel IplImage* g_dst = cvCreateImage(cvGetSize(in), IPL_DEPTH_8U, 1); // G channel IplImage* b_dst = cvCreateImage(cvGetSize(in), IPL_DEPTH_8U, 1); // B channel cvSplit(in, r, g, b, NULL); cvSplit(fon, r_fon, g_fon, b_fon, NULL); cvAbsDiff(g,g_fon,r_dst); cvAbsDiff(g,g_fon,g_dst); cvAbsDiff(b,b_fon,b_dst); cvThreshold(r_dst,r_dst,50,255,CV_THRESH_BINARY); cvThreshold(g_dst,g_dst,50,255,CV_THRESH_BINARY); cvThreshold(b_dst,b_dst,50,255,CV_THRESH_BINARY); cvErode(r_dst,r_dst,NULL,1); cvErode(g_dst,g_dst,NULL,1); cvErode(b_dst,b_dst,NULL,1); cvDilate(r_dst,r_dst,NULL,1); cvDilate(g_dst,g_dst,NULL,1); cvDilate(b_dst,b_dst,NULL,1); IplImage* out_img = cvCreateImage(cvGetSize(in), IPL_DEPTH_8U, 3); cvCvtScale cvCvtColor(r_dst, out_img, CV_GRAY2RGB); cvShowImage("R",out_img); cvCvtColor(g_dst, out_img, CV_GRAY2RGB); cvShowImage("G",out_img); cvCvtColor(b_dst, out_img, CV_GRAY2RGB); cvShowImage("B",out_img); cvWaitKey(0); cvReleaseImage(&out_img); cvReleaseImage(&in); cvReleaseImage(&r); cvReleaseImage(&g); cvReleaseImage(&; cvReleaseImage(&fon); cvReleaseImage(&r_fon); cvReleaseImage(&g_fon); cvReleaseImage(&b_fon); cvReleaseImage(&r_dst); cvReleaseImage(&g_dst); cvReleaseImage(&b_dst); cvDestroyAllWindows();[/code] Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
outl4w 0 Жалоба Опубликовано May 31, 2011 Увы, нет! Результат не изменился А у Вас в листинге cvCvtScale без параметров вообще, функция нужна или нет эта? А может такое быть, что мозги слетели либо у OpenCV, либо у VS2008? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано May 31, 2011 cvCvtScale нечаянно осталась. Лучше выложи своё изображение, чтобы не гадать. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
outl4w 0 Жалоба Опубликовано May 31, 2011 Хорошо, не вопрос. Изображения очень простые. Само изображение: test2.bmp Фоновое: test2_fon.bmp Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано May 31, 2011 Похоже, что у тебя и правда проблемы с окружением, а не с программой. Мой вариант у меня работает правильно. Попробуй, кстати, с отладочной и релизной OpenCV запустить. Разница есть? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
outl4w 0 Жалоба Опубликовано June 1, 2011 Запустил... Разница только в том, что вместо белых полосок теперь черные! В остальном всё то же самое. Вот и я говорю, что всё работало раньше, а потом в один раз как-то всё пропало. Помню, я тогда игрался с тем, что если определённую переменную типа bool не задать, то какие-то операции над определённым каналом не производятся. Кусок кода был вроде такого: ... if(r_enable){ cvAbsDiff(r,r_fon,r_dst); cvThreshold(r_dst,r_dst,50,255,CV_THRESH_BINARY); cvErode(r_dst,r_dst,NULL,1); cvDilate(r_dst,r_dst,NULL,1); cvShowImage("R",r_dst); } if(g_enable){ cvAbsDiff(g,g_fon,g_dst); cvThreshold(g_dst,g_dst,50,255,CV_THRESH_BINARY); cvErode(g_dst,g_dst,NULL,1); cvDilate(g_dst,g_dst,NULL,1); cvShowImage("G",g_dst); } if(b_enable){ cvAbsDiff(b,b_fon,b_dst); cvThreshold(b_dst,b_dst,50,255,CV_THRESH_BINARY); cvErode(b_dst,b_dst,NULL,1); cvDilate(b_dst,b_dst,NULL,1); cvShowImage("B",b_dst); } ... Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
outl4w 0 Жалоба Опубликовано June 1, 2011 Во, только что попробовал такой код, предварительно установив все булевы переменные в true, мне все три канала вывелись черными! Комментирую строчки с if, перекомпилирую, каналы по-прежнему чёрные. Беру, копирую код с первого моего поста, вставляю, компилирую - нет только одного канала, первого! Мистика какая-то Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах