Перейти к содержимому
Compvision.ru
outl4w

проблема с cvThreshold

Recommended Posts

Доброе время суток!

Возникла такая проблемка, при выполнении следующего кода (вычитание фона из изображения и затем его морфологические преобразования), получаю результат, как на приложенном изображении.

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

post-1906-0-01472000-1306766390_thumb.jp

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А если так?

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]

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Увы, нет! Результат не изменился :( А у Вас в листинге cvCvtScale без параметров вообще, функция нужна или нет эта?

А может такое быть, что мозги слетели либо у OpenCV, либо у VS2008? :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

cvCvtScale нечаянно осталась. Лучше выложи своё изображение, чтобы не гадать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Похоже, что у тебя и правда проблемы с окружением, а не с программой. Мой вариант у меня работает правильно.

Попробуй, кстати, с отладочной и релизной OpenCV запустить. Разница есть?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Запустил... Разница только в том, что вместо белых полосок теперь черные! В остальном всё то же самое.

Вот и я говорю, что всё работало раньше, а потом в один раз как-то всё пропало. Помню, я тогда игрался с тем, что если определённую переменную типа 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);

}

...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Во, только что попробовал такой код, предварительно установив все булевы переменные в true, мне все три канала вывелись черными! Комментирую строчки с if, перекомпилирую, каналы по-прежнему чёрные. Беру, копирую код с первого моего поста, вставляю, компилирую - нет только одного канала, первого! Мистика какая-то :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×