Доброе время суток!
Возникла такая проблемка, при выполнении следующего кода (вычитание фона из изображения и затем его морфологические преобразования), получаю результат, как на приложенном изображении.
Видно, что красный канал в принципе отсутствует. И это вне зависимости от изображений, которых я передаю приложению. Причём, по-началу всё работало нормально (присутствовали только эти дурацкие вертикальные полоски, о которых я скажу чуть похже), потом однажды хоп, и пропал канал. Давай всяко-разно крутить-вертеть... Сейчас получается такая ситуация, что пропадает именно тот канал, к которому первым применяется функция 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]