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

Очистка памяти

Recommended Posts

Без cvReleaseImage программа через некоторое время вылетает, но вся проблема в том что после прописания вот этой строчки -cvReleaseImage( &ImageRGB);, компилятор ругается - error C2664: cvReleaseImage: невозможно преобразовать параметр 1 из 'cli::interior_ptr<Type>' в 'IplImage **'

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


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

По аналогии с тем что здесь: http://stackoverflow.com/questions/11583851/cannot-convert-parameter-1-from-cliinterior-ptrtype-to-cvcapture


pin_ptr<IplImage *> p;
p = &ImageRGB;
cvReleaseCapture( p );
[/code]

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


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

Спасибо, с этим вроде разобрался, но теперь возникает другое исключение.

В ходе работы вот в этой строчке: imageRGB = cvCreateImage( cvSize(frame->width, frame->height), IPL_DEPTH_8U, 3 );

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


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

используйте опенцвэшный умный указатель Ptr<>

память будет сама очищаться.


Ptr<IplImage> src= cvLoadImage("1.tif");

src.release(); // если надо очистить память явно

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


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

Да бы не городить новую тему, спрошу сдесь.

Перевожу в в монохромное с выделением нужного цвета вот таким образом:

IplImage* TreatmentImage::YellowInBlackAndWhite(IplImage* rgb ,int B, int G, int R){

		int x, y;

		ptr = (uchar*)(rgb->imageData);

        for(x = 0; x<rgb->width-1; x++){ //преобразуем изображение с желтыми метками в монохромное 

			for (y = 0; y<rgb->height-1; y++){

				if      ((ptr[3*x+y*rgb->widthStep] < 

					&& (ptr[3*x+1+y*rgb->widthStep] > G)

					&& (ptr[3*x+2+y*rgb->widthStep] > R)) {

				ptr[3*x+y*rgb->widthStep]   = 255; //H

				ptr[3*x+1+y*rgb->widthStep] = 255; //S

				ptr[3*x+2+y*rgb->widthStep] = 255; //V

			} else {

                ptr[3*x+y*rgb->widthStep]   = 0;

				ptr[3*x+1+y*rgb->widthStep] = 0; 

				ptr[3*x+2+y*rgb->widthStep] = 0; 

				}

			}

		}

		return rgb;

}[/code]

прохо выделяется искомый цвет, и очень большое влияние оказывает внешнее освещение.

Подскажите как тут быть, менять камеру (на подобии Logitech Webcam C600) или городить подсветку?

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


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

Изображение лучше перевести в HSV и работать с компонентой Hue ее значение должно быть для желтого в районе 60 и Saturation, ее значение задать больше некоторого порога (30 например), иначе будет и белый цвет выделять.

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


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

Перевел изображение в HSV, но перед выводом его в image оно не складывается


private: System::Void MainForm_Shown(System::Object^  sender, System::EventArgs^  e) {

			 //Cam->capture = cvCreateCameraCapture(CV_CAP_ANY);

			 capture = cvCreateCameraCapture(CV_CAP_ANY);

			 if (capture != 0) { //проверяем наличие подключенных камер

		       this->label4->Visible = false; //скрываем надписьCybSys... 

			   SettingForm->label7->Text = "Видеокамера включена!";

			   frame = cvQueryFrame( capture );

	    imageRGB = cvCreateImage( cvSize(frame->width, frame->height), IPL_DEPTH_8U, 3 );

        hsv = cvCreateImage( cvSize(frame->width, frame->height), IPL_DEPTH_8U, 3 );

		h_plane = cvCreateImage( cvSize(frame->width, frame->height), IPL_DEPTH_8U, 1 );

        s_plane = cvCreateImage( cvSize(frame->width, frame->height), IPL_DEPTH_8U, 1 );

        v_plane = cvCreateImage( cvSize(frame->width, frame->height), IPL_DEPTH_8U, 1 );

        h_range = cvCreateImage( cvSize(frame->width, frame->height), IPL_DEPTH_8U, 1 );

        s_range = cvCreateImage( cvSize(frame->width, frame->height), IPL_DEPTH_8U, 1 );

        v_range = cvCreateImage( cvSize(frame->width, frame->height), IPL_DEPTH_8U, 1 );

        hsv_and = cvCreateImage( cvSize(frame->width, frame->height), IPL_DEPTH_8U, 1 );

        //  конвертируем в HSV 

        cvCvtColor( frame, hsv, CV_BGR2HSV ); 

        // разбиваем на отельные каналы

        cvCvtPixToPlane( hsv, h_plane, s_plane, v_plane, 0 );


			   if (OpenFileColor(R, G, == -1) {

				   System::Windows::Forms::MessageBox::Show("Данные не были Прочитаны из файла!", "Ошибка чтения");} 

			   else { 

				   this->timer1->Start();  //запускаем таймер

			   }

			 } else {	 

				  SettingForm->label7->Text = "Видеокамера не подключена!";

			   }

		 }


 private: System::Void timer1_Tick(System::Object^  sender, System::EventArgs^  e) {

                         myTrackbarHmin(SettingForm->hScrollBar1->Value);

			 myTrackbarHmax(SettingForm->hScrollBar2->Value);

			 myTrackbarHmin(SettingForm->hScrollBar3->Value);

			 myTrackbarHmax(SettingForm->hScrollBar4->Value);

			 myTrackbarHmin(SettingForm->hScrollBar5->Value);

			 myTrackbarHmax(SettingForm->hScrollBar6->Value);


			 //получаем кадр  

			 frame = cvQueryFrame( capture );

			 //  конвертируем в HSV 

        cvCvtColor( frame, hsv, CV_BGR2HSV ); 

        // разбиваем на отельные каналы

        cvCvtPixToPlane( hsv, h_plane, s_plane, v_plane, 0 );


 cvAnd(h_range, s_range, hsv_and);

                cvAnd(hsv_and, v_range, hsv_and);


			 Bitmap^ bmpSetting = (gcnew System::Drawing::Bitmap(hsv_and->width, hsv_and->height, hsv_and->widthStep, 

			         System::Drawing::Imaging::PixelFormat::Format24bppRgb,(System::IntPtr)hsv_and->imageData));


        SettingForm->pictureBox1->Image = bmpSetting;}[/code]

п.с. на подписи скрол баров прошу внимания не обращать )

post-6283-0-44087300-1371582477_thumb.pn

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


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

hsv_and = cvCreateImage( cvSize(frame->width, frame->height), IPL_DEPTH_8U, 1 ); // 1 канал (8 бит на точку)
Bitmap^ bmpSetting = (gcnew System::Drawing::Bitmap(hsv_and->width, hsv_and->height, hsv_and->widthStep,System::Drawing::Imaging::PixelFormat::Format24bppRgb,(System::IntPtr)hsv_and->imageData)); // 3 канала (24 бит на точку)

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


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

спасибо, за наводку но какой формат выбрать все перебрал (http://msdn.microsoft.com/ru-ru/library/system.drawing.imaging.pixelformat.aspx)

подходит только Format8bppIndexed, но изображение вместо белого отдает в краснину

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×