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

Вывод видео на форму в visual studio 2008 - 2010

Recommended Posts

Пытаюсь вывести изображение вот таким вот образом:

// получаем следующий кадр

frame = cvQueryFrame( capture );

// показываем кадр

pictureBox1->Image = gcnew System::Drawing::Bitmap( frame->width,frame->height,frame->widthStep,System::Drawing::Imaging::PixelFormat::Undefined, ( System::IntPtr ) frame-> imageData);

Но возникает ошибка: Необработанное исключение типа "System.NullReferenceException"

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


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

Есть предположение что Bitmap не создается.

Подробнее не подскажу .NET не моё.

ЗЫ: Посмотрите пост №65

там есть строчка:


this->pictureBox1->Image = gcnew Bitmap(frame.cols, frame.rows, frame.step, PixelFormat::Format24bppRgb, IntPtr(frame.data));
[/code]

Смысл вроде тот-же но она отличается от Вашей (хотя здесь работа с cv::Mat).

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


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

Smorodov, застрял я совершенно. Получил из файла три матрицы R G B. Вывожу их так:

static void ishoW3(array<int, 2>^ R, array<int, 2>^ G, array<int, 2>^ B ) {

      static cv::String imgName = "Color Image ";

      static char c = '0';

      imgName.clear();


      int rows = R->GetLength(0); 

      int cols = R->GetLength(1);

      CvSize cs;

      cs.height = rows; 

      cs.width = cols; 



      cv::Mat c_image;

      //c_image.release();

      c_image = cvCreateImage(cs,IPL_DEPTH_8U,3);


 	for (int i=0; i<rows; i++)

 	{

          uchar* data = c_image.ptr<uchar>(i);

          for (int j=0; j<cols; j++) 

          {

   			*data++ = B[i,j]/4;

   			*data++ = G[i,j]/4;

   			*data++ = R[i,j]/4;

          }

 	}


    if(!c_image.empty())

    {

 		cv::namedWindow(imgName);

 		cv::imshow(imgName, c_image);

 		cv::waitKey(1);

    }

}

Все вроде бы нормально, но не могу вывести другие R G B матрицы в новое окно. Надо сменить имя окна, но не знаю как передать функции имя окна, String^ не конвертируется в static cv::String.

Пытался вывести картинку через структуру IplImage, но не понимаю как в нее загрузить мои матрицы R G B. Подскажите пожалуйста как это сделать?

Мне нужно создать два окна и в каждое из них выводить свое изображение из своих матриц R G B.

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


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

Я с cli не работаю (только если очень надо :) ), но вроде проблемы с конвертацией быть не должно:

Тут все написано.

ЗЫ: создавать окно каждый кадр - это лишнее.

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


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

Да лишнее, но у меня как бы два потока фреймов и каждый надо выводить в свое окно поочередно, т.е. фрейм из потока 1 в окно 1, затем фрейм из потока 2 в окно 2, затем опять фрейм из потока 1 в окно 1 и т.д. в этом проблема. Мне надо как то зафиксировать окно, напр, обращаться к нему по имени.

Как наполнить структуру IplImage данными матриц R G B? Наподобие того как я заполняю cv::Mat



for (int i=0; i<rows; i++)

{

     uchar* data = c_image.ptr<uchar>(i);

     for (int j=0; j<cols; j++) 

    {

         *data++ = B[i,j]/4;

         *data++ = G[i,j]/4;

         *data++ = R[i,j]/4;

     }

}

Спасибо за ссылку по конвертации стрингов.

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


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

Установка байтов красного слоя в 255. Взял отсюда: http://stackoverflow.com/questions/6899218/writing-to-iplimage-imagedata

int main (int argc, const char * argv[]) {

IplImage *frame = cvCreateImage(cvSize(41, 41), IPL_DEPTH_8U, 3);

for( int y=0; y<frame->height; y++ ) {
uchar* ptr = (uchar*) ( frame->imageData + y * frame->widthStep );
for( int x=0; x<frame->width; x++ ) {
ptr[3*x+2] = 255; //Set red to max (BGR format)
}
}

cvNamedWindow("window", CV_WINDOW_AUTOSIZE);
cvShowImage("window", frame);
cvWaitKey(0);
cvReleaseImage(&frame);
cvDestroyWindow("window");
return 0;
}[/code]

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


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

Smorodov, спасибо! Продвинулся немного.

Написал функцию, получающую R G B и выводящую картинку



  static void ishow3(String^ img_Name, RawData^ RD)

  {

  	string imgName;

  	MarshalString(img_Name, imgName);

  	static string namewindow;


  	if (imgName.compare(namewindow) != 0) // если функция получает старое имя окна, то оно вновь не создается, картинка выводится в старое окно

  	{

	  	cvNamedWindow(imgName.c_str(), CV_WINDOW_AUTOSIZE);

	  	namewindow = imgName.c_str();  // как странно это работает! Разве стринги так копируются?

  	}


  	IplImage* frame = draw::get_colorimage(RD);

  	cvShowImage(imgName.c_str(), frame);

  	cvWaitKey(1);

  }



  static IplImage* get_colorimage(RawData^ RD)

  {

	int rows = RD->R->GetLength(0);

	int cols = RD->R->GetLength(1);

    IplImage *frame = cvCreateImage(cvSize(cols,rows),IPL_DEPTH_8U,3);


    for(int y=0; y < frame->height; y++) 

	{ 

        uchar* data = (uchar*)(frame->imageData + y*frame->widthStep); 

        for(int x=0; x < frame->width; x++)

		{ 

			*data++ = RD->B[y,x]/4; // делю на 4 т.к. мои данные 10-ти битные 

			*data++ = RD->G[y,x]/4; // цепочка bgrbgrbgr....

			*data++ = RD->R[y,x]/4;

		} 

	}

	return frame; 

  }

Т.е. все почти так как и было у меня. Интересно что функция cvCreateImage может возвращать как IplImage* так и Mat. Как такое возможно?

Оказывается что в дебагере нельзя увидеть значение namewindow. Почему бы это? Если static, то нельзя?

Мои окна перекрывают друг друга. Как задать координаты окна (Left, Top) в которое выводится картинка?

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


Ссылка на сообщение
Поделиться на других сайтах
Интересно что функция cvCreateImage может возвращать как IplImage* так и Mat. Как такое возможно?

Просто определено преобразование IplImage* в Mat.

Оказывается что в дебагере нельзя увидеть значение namewindow. Почему бы это? Если static, то нельзя?

Не помню чтобы сталкивался с таким, поэтому хз.

Можно просто выводить его в консоль.

Ставим точку останова, что последнее напечатано в консоли, значит оно и есть.

Как задать координаты окна (Left, Top) в которое выводится картинка?

cvMoveWindow("win_name", x, y);

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


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

Smorodov, спасибо за предыдущий ответ. Еще одна проблема с инклюдами вероятно.

Возникает такая ошибка

74a3b667ac24.png

или

1d0e1ec47e22.png

Перешел на консоль и вот класс draw.h с одной функцией


#pragma once

#include <cv.h>

#include <highgui.h>

#include "cmatrix.h"


using namespace cv;


class draw // drawfuncs

{

  public:

	void ishowM(CMatrix);

};
Вот реализация draw.cpp

#include "stdafx.h"

#include "drawfuncs.h"


IplImage* mat2gray(CMatrix M)

{

	CvSize cs;

	cs.height = M.nRows;

	cs.width  = M.nCols;

	IplImage *frame = cvCreateImage(cs, IPL_DEPTH_8U, 3);


	uchar tmp;

	short *temp = M[0];

    for(int y=0; y < frame->height; y++) 

	{ 

        uchar* data = (uchar*)(frame->imageData + y*frame->widthStep); 


        for(int x=0; x < frame->width; x++)

		{ 

			tmp = (*temp++)/4;

			*data++ = tmp;

			*data++ = tmp;

			*data++ = tmp;

		}

	}

	return frame;

}


void draw::ishowM(CMatrix M)

{

	IplImage* frame = mat2gray(M);	


	cvShowImage("example", frame);

	cvWaitKey(1);

	cvReleaseImage(&frame);

	cvDestroyWindow("example");

}

Если все закомментировать, оставить только IplImage *frame = cvCreateImage(cs, IPL_DEPTH_8U, 3);, то все равно ошибка сохраняется. Класс CMatrix очень простой, там ошибки нет. Она где то в инклюдах думаю. Может быть есть что сказать.

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


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

Ошибка найдена, надо было добавить &

void ishowM(CMatrix&);

IplImage* mat2gray(CMatrix&);

в классе CMatrix не был прописан копиконструктор

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


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

У меня вообщем такая беда. Работаю с Windows Form, делаю отображение видео на форму, все отображается, но при попытке использовать cvReleaseImage выбивает ошибку:

error C2664: cvReleaseCapture: невозможно преобразовать параметр 1 из "cli::interior_ptr<Type>" в "CvCapture **"

1> with

1> [

1> Type=CvCapture *

1> ]

1> Нельзя преобразовать управляемый тип в неуправляемый тип

Как можно от неё избавится?

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


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

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


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

С этим разобрался, спасибо за ссылку. Теперь новая проблема. При включении видео, процесс проекта начинает жестко забивать оперативную память и даже после его прерывания память остаётся забитой. Почему так и как можно исправить??

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


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

Всем привет!

Использую связку qt + vs2010 + QT

Вывожу видео с камеры кинекта на форму(испольую таймер) и имею след. проблему:

Видео на форме играется только тогда, когда оно параллельно выводится в окно opencv, если его не выводить cv::imshow("dd", view); то программа просто зависает

причем не ему все равно что выводить, например на форме rgb, то в окошко можно вывести хоть карту глубины.

В прошлой программе я выводил на форму 4 видео, три из них работали нормально, а четвертому тоже необхожимо было вводить еще и в окно , иначе на форме не показывало ничего.

Ваши идеи, в чем проблема?

Я предполагаю что что то с таймером, но черт его знает


if (capture.isOpened()==true)

		{

			capture.grab();

			capture.retrieve( depth_mat, CV_CAP_OPENNI_DEPTH_MAP );

			capture.retrieve( bgr_mat, CV_CAP_OPENNI_BGR_IMAGE);

			capture.retrieve(world, CV_CAP_OPENNI_POINT_CLOUD_MAP);

			double min_val, max_val;

			cv::minMaxIdx(depth_mat, &min_val, &max_val);

			double scale=255/max_val;

			depth_mat*=scale;

			view=depth_mat;	



                        cv::imshow("dd", view);


		}

    key=cv::waitKey(50);

	}

	capture.release();



или imshow прерывает цикл как то? или из за key=cv::waitKey(50), вообщем не знаю

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


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

Здравствуйте. Использую Visual Studio 12 и openCV 2.7. Консольное приложение компилируется и запускается без проблем, работает как надо. Но в приложении windows forms всё время обнаруживаются какие нибудь ошибки при компиляции, скачивал из этой темы приложение VideoOnForm, оно тоже не работает.

Вот такие ошибки:

MyForm.obj : warning LNK4248: эхЁрчЁх°хээр  ыхъёхьр TypeRef (0100003B) фы  "CvCapture"; юсЁрч эхы№ч  чряєёЄшЄ№

1>1.obj : warning LNK4248: эхЁрчЁх°хээр  ыхъёхьр TypeRef (01000048) фы  "CvCapture"; юсЁрч эхы№ч  чряєёЄшЄ№

1>MyForm.obj : error LNK2028: ёё√ыър эр эхЁрчЁх°хээє■ ыхъёхьє (0A00093F) "extern "C" struct _IplImage * __cdecl cvQueryFrame(struct CvCapture *)" (?cvQueryFrame@@$$J0YAPAU_IplImage@@PAUCvCapture@@@Z) т ЇєэъЎшш "private: void __clrcall My1::MyForm::timer1_Tick(class System::Object ^,class System::EventArgs ^)" (?timer1_Tick@MyForm@My1@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)

1>1.obj : error LNK2028: ёё√ыър эр эхЁрчЁх°хээє■ ыхъёхьє (0A000952) "extern "C" struct _IplImage * __cdecl cvQueryFrame(struct CvCapture *)" (?cvQueryFrame@@$$J0YAPAU_IplImage@@PAUCvCapture@@@Z) т ЇєэъЎшш "private: void __clrcall My1::MyForm::timer1_Tick(class System::Object ^,class System::EventArgs ^)" (?timer1_Tick@MyForm@My1@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)

1>MyForm.obj : error LNK2028: ёё√ыър эр эхЁрчЁх°хээє■ ыхъёхьє (0A000942) "extern "C" struct CvCapture * __cdecl cvCreateFileCapture(char const *)" (?cvCreateFileCapture@@$$J0YAPAUCvCapture@@PBD@Z) т ЇєэъЎшш "private: void __clrcall My1::MyForm::button2_Click(class System::Object ^,class System::EventArgs ^)" (?button2_Click@MyForm@My1@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)

1>1.obj : error LNK2028: ёё√ыър эр эхЁрчЁх°хээє■ ыхъёхьє (0A000955) "extern "C" struct CvCapture * __cdecl cvCreateFileCapture(char const *)" (?cvCreateFileCapture@@$$J0YAPAUCvCapture@@PBD@Z) т ЇєэъЎшш "private: void __clrcall My1::MyForm::button2_Click(class System::Object ^,class System::EventArgs ^)" (?button2_Click@MyForm@My1@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)

1>MyForm.obj : error LNK2020: эхЁрчЁх°хээр  ыхъёхьр (0A0009BF) "public: void __thiscall cv::Mat::copySize(class cv::Mat const &)" (?copySize@Mat@cv@@$$FQAEXABV12@@Z)

1>1.obj : error LNK2028: ёё√ыър эр эхЁрчЁх°хээє■ ыхъёхьє (0A0009D2) "public: void __thiscall cv::Mat::copySize(class cv::Mat const &)" (?copySize@Mat@cv@@$$FQAEXABV12@@Z) т ЇєэъЎшш "public: __thiscall cv::Mat::Mat(class cv::Mat const &)" (??0Mat@cv@@$$FQAE@ABV01@@Z)

1>MyForm.obj : error LNK2028: ёё√ыър эр эхЁрчЁх°хээє■ ыхъёхьє (0A0009C0) "int __cdecl cv::_interlockedExchangeAdd(int *,int)" (?_interlockedExchangeAdd@cv@@$$FYAHPAHH@Z) т ЇєэъЎшш "public: void __thiscall cv::SparseMat::addref(void)" (?addref@SparseMat@cv@@$$FQAEXXZ)

1>1.obj : error LNK2028: ёё√ыър эр эхЁрчЁх°хээє■ ыхъёхьє (0A0009D3) "int __cdecl cv::_interlockedExchangeAdd(int *,int)" (?_interlockedExchangeAdd@cv@@$$FYAHPAHH@Z) т ЇєэъЎшш "public: void __thiscall cv::SparseMat::addref(void)" (?addref@SparseMat@cv@@$$FQAEXXZ)

1>1.obj : error LNK2019: ёё√ыър эр эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы "int __cdecl cv::_interlockedExchangeAdd(int *,int)" (?_interlockedExchangeAdd@cv@@$$FYAHPAHH@Z) т ЇєэъЎшш "public: void __thiscall cv::SparseMat::addref(void)" (?addref@SparseMat@cv@@$$FQAEXXZ)

1>MyForm.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""int __cdecl cv::_interlockedExchangeAdd(int *,int)" (?_interlockedExchangeAdd@cv@@$$FYAHPAHH@Z)"

1>1.obj : error LNK2019: ёё√ыър эр эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы "extern "C" struct CvCapture * __cdecl cvCreateFileCapture(char const *)" (?cvCreateFileCapture@@$$J0YAPAUCvCapture@@PBD@Z) т ЇєэъЎшш "private: void __clrcall My1::MyForm::button2_Click(class System::Object ^,class System::EventArgs ^)" (?button2_Click@MyForm@My1@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)

1>MyForm.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""extern "C" struct CvCapture * __cdecl cvCreateFileCapture(char const *)" (?cvCreateFileCapture@@$$J0YAPAUCvCapture@@PBD@Z)"

1>1.obj : error LNK2019: ёё√ыър эр эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы "extern "C" struct _IplImage * __cdecl cvQueryFrame(struct CvCapture *)" (?cvQueryFrame@@$$J0YAPAU_IplImage@@PAUCvCapture@@@Z) т ЇєэъЎшш "private: void __clrcall My1::MyForm::timer1_Tick(class System::Object ^,class System::EventArgs ^)" (?timer1_Tick@MyForm@My1@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)

1>MyForm.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""extern "C" struct _IplImage * __cdecl cvQueryFrame(struct CvCapture *)" (?cvQueryFrame@@$$J0YAPAU_IplImage@@PAUCvCapture@@@Z)"

1>1.obj : error LNK2019: ёё√ыър эр эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы "public: void __thiscall cv::Mat::copySize(class cv::Mat const &)" (?copySize@Mat@cv@@$$FQAEXABV12@@Z) т ЇєэъЎшш "public: __thiscall cv::Mat::Mat(class cv::Mat const &)" (??0Mat@cv@@$$FQAE@ABV01@@Z)

1>MyForm.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: void __thiscall cv::Mat::copySize(class cv::Mat const &)" (?copySize@Mat@cv@@$$FQAEXABV12@@Z)"

1>1.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual void __thiscall cv::HOGDescriptor::setSVMDetector(class cv::_InputArray const &)" (?setSVMDetector@HOGDescriptor@cv@@UAEXABV_InputArray@2@@Z)"

1>MyForm.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual void __thiscall cv::HOGDescriptor::setSVMDetector(class cv::_InputArray const &)" (?setSVMDetector@HOGDescriptor@cv@@UAEXABV_InputArray@2@@Z)"

1>1.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual bool __thiscall cv::HOGDescriptor::read(class cv::FileNode &)" (?read@HOGDescriptor@cv@@UAE_NAAVFileNode@2@@Z)"

1>MyForm.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual bool __thiscall cv::HOGDescriptor::read(class cv::FileNode &)" (?read@HOGDescriptor@cv@@UAE_NAAVFileNode@2@@Z)"

1>1.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual void __thiscall cv::HOGDescriptor::write(class cv::FileStorage &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)const " (?write@HOGDescriptor@cv@@UBEXAAVFileStorage@2@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)"

1>MyForm.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual void __thiscall cv::HOGDescriptor::write(class cv::FileStorage &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)const " (?write@HOGDescriptor@cv@@UBEXAAVFileStorage@2@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)"

1>1.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual bool __thiscall cv::HOGDescriptor::load(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?load@HOGDescriptor@cv@@UAE_NABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@0@Z)"

1>MyForm.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual bool __thiscall cv::HOGDescriptor::load(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?load@HOGDescriptor@cv@@UAE_NABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@0@Z)"

1>1.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual void __thiscall cv::HOGDescriptor::save(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)const " (?save@HOGDescriptor@cv@@UBEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@0@Z)"

1>MyForm.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual void __thiscall cv::HOGDescriptor::save(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)const " (?save@HOGDescriptor@cv@@UBEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@0@Z)"

1>1.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual void __thiscall cv::HOGDescriptor::copyTo(struct cv::HOGDescriptor &)const " (?copyTo@HOGDescriptor@cv@@UBEXAAU12@@Z)"

1>MyForm.obj : error LNK2019: ёё√ыър эр эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы "public: virtual void __thiscall cv::HOGDescriptor::copyTo(struct cv::HOGDescriptor &)const " (?copyTo@HOGDescriptor@cv@@UBEXAAU12@@Z) т ЇєэъЎшш "[T2M] public: __thiscall std::move_iterator<class std::_Vector_iterator<class std::_Vector_val<struct std::_Simple_types<unsigned int> > > >::move_iterator<class std::_Vector_iterator<class std::_Vector_val<struct std::_Simple_types<unsigned int> > > >(class std::move_iterator<class std::_Vector_iterator<class std::_Vector_val<struct std::_Simple_types<unsigned int> > > > const &)" (__t2m@??0?$move_iterator@V?$_Vector_iterator@V?$_Vector_val@U?$_Simple_types@I@std@@@std@@@std@@@std@@QAE@ABV01@@Z)

1>1.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual void __thiscall cv::HOGDescriptor::compute(class cv::Mat const &,class std::vector<float,class std::allocator<float> > &,class cv::Size_<int>,class cv::Size_<int>,class std::vector<class cv::Point_<int>,class std::allocator<class cv::Point_<int> > > const &)const " (?compute@HOGDescriptor@cv@@UBEXABVMat@2@AAV?$vector@MV?$allocator@M@std@@@std@@V?$Size_@H@2@2ABV?$vector@V?$Point_@H@cv@@V?$allocator@V?$Point_@H@cv@@@std@@@5@@Z)"

1>MyForm.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual void __thiscall cv::HOGDescriptor::compute(class cv::Mat const &,class std::vector<float,class std::allocator<float> > &,class cv::Size_<int>,class cv::Size_<int>,class std::vector<class cv::Point_<int>,class std::allocator<class cv::Point_<int> > > const &)const " (?compute@HOGDescriptor@cv@@UBEXABVMat@2@AAV?$vector@MV?$allocator@M@std@@@std@@V?$Size_@H@2@2ABV?$vector@V?$Point_@H@cv@@V?$allocator@V?$Point_@H@cv@@@std@@@5@@Z)"

1>1.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual void __thiscall cv::HOGDescriptor::detect(class cv::Mat const &,class std::vector<class cv::Point_<int>,class std::allocator<class cv::Point_<int> > > &,double,class cv::Size_<int>,class cv::Size_<int>,class std::vector<class cv::Point_<int>,class std::allocator<class cv::Point_<int> > > const &)const " (?detect@HOGDescriptor@cv@@UBEXABVMat@2@AAV?$vector@V?$Point_@H@cv@@V?$allocator@V?$Point_@H@cv@@@std@@@std@@NV?$Size_@H@2@2ABV45@@Z)"

1>MyForm.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual void __thiscall cv::HOGDescriptor::detect(class cv::Mat const &,class std::vector<class cv::Point_<int>,class std::allocator<class cv::Point_<int> > > &,double,class cv::Size_<int>,class cv::Size_<int>,class std::vector<class cv::Point_<int>,class std::allocator<class cv::Point_<int> > > const &)const " (?detect@HOGDescriptor@cv@@UBEXABVMat@2@AAV?$vector@V?$Point_@H@cv@@V?$allocator@V?$Point_@H@cv@@@std@@@std@@NV?$Size_@H@2@2ABV45@@Z)"

1>1.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual void __thiscall cv::HOGDescriptor::detect(class cv::Mat const &,class std::vector<class cv::Point_<int>,class std::allocator<class cv::Point_<int> > > &,class std::vector<double,class std::allocator<double> > &,double,class cv::Size_<int>,class cv::Size_<int>,class std::vector<class cv::Point_<int>,class std::allocator<class cv::Point_<int> > > const &)const " (?detect@HOGDescriptor@cv@@UBEXABVMat@2@AAV?$vector@V?$Point_@H@cv@@V?$allocator@V?$Point_@H@cv@@@std@@@std@@AAV?$vector@NV?$allocator@N@std@@@5@NV?$Size_@H@2@3ABV45@@Z)"

1>MyForm.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual void __thiscall cv::HOGDescriptor::detect(class cv::Mat const &,class std::vector<class cv::Point_<int>,class std::allocator<class cv::Point_<int> > > &,class std::vector<double,class std::allocator<double> > &,double,class cv::Size_<int>,class cv::Size_<int>,class std::vector<class cv::Point_<int>,class std::allocator<class cv::Point_<int> > > const &)const " (?detect@HOGDescriptor@cv@@UBEXABVMat@2@AAV?$vector@V?$Point_@H@cv@@V?$allocator@V?$Point_@H@cv@@@std@@@std@@AAV?$vector@NV?$allocator@N@std@@@5@NV?$Size_@H@2@3ABV45@@Z)"

1>1.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual void __thiscall cv::HOGDescriptor::detectMultiScale(class cv::Mat const &,class std::vector<class cv::Rect_<int>,class std::allocator<class cv::Rect_<int> > > &,double,class cv::Size_<int>,class cv::Size_<int>,double,double,bool)const " (?detectMultiScale@HOGDescriptor@cv@@UBEXABVMat@2@AAV?$vector@V?$Rect_@H@cv@@V?$allocator@V?$Rect_@H@cv@@@std@@@std@@NV?$Size_@H@2@2NN_N@Z)"

1>MyForm.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual void __thiscall cv::HOGDescriptor::detectMultiScale(class cv::Mat const &,class std::vector<class cv::Rect_<int>,class std::allocator<class cv::Rect_<int> > > &,double,class cv::Size_<int>,class cv::Size_<int>,double,double,bool)const " (?detectMultiScale@HOGDescriptor@cv@@UBEXABVMat@2@AAV?$vector@V?$Rect_@H@cv@@V?$allocator@V?$Rect_@H@cv@@@std@@@std@@NV?$Size_@H@2@2NN_N@Z)"

1>1.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual void __thiscall cv::HOGDescriptor::detectMultiScale(class cv::Mat const &,class std::vector<class cv::Rect_<int>,class std::allocator<class cv::Rect_<int> > > &,class std::vector<double,class std::allocator<double> > &,double,class cv::Size_<int>,class cv::Size_<int>,double,double,bool)const " (?detectMultiScale@HOGDescriptor@cv@@UBEXABVMat@2@AAV?$vector@V?$Rect_@H@cv@@V?$allocator@V?$Rect_@H@cv@@@std@@@std@@AAV?$vector@NV?$allocator@N@std@@@5@NV?$Size_@H@2@3NN_N@Z)"

1>MyForm.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual void __thiscall cv::HOGDescriptor::detectMultiScale(class cv::Mat const &,class std::vector<class cv::Rect_<int>,class std::allocator<class cv::Rect_<int> > > &,class std::vector<double,class std::allocator<double> > &,double,class cv::Size_<int>,class cv::Size_<int>,double,double,bool)const " (?detectMultiScale@HOGDescriptor@cv@@UBEXABVMat@2@AAV?$vector@V?$Rect_@H@cv@@V?$allocator@V?$Rect_@H@cv@@@std@@@std@@AAV?$vector@NV?$allocator@N@std@@@5@NV?$Size_@H@2@3NN_N@Z)"

1>1.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual void __thiscall cv::HOGDescriptor::computeGradient(class cv::Mat const &,class cv::Mat &,class cv::Mat &,class cv::Size_<int>,class cv::Size_<int>)const " (?computeGradient@HOGDescriptor@cv@@UBEXABVMat@2@AAV32@1V?$Size_@H@2@2@Z)"

1>MyForm.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual void __thiscall cv::HOGDescriptor::computeGradient(class cv::Mat const &,class cv::Mat &,class cv::Mat &,class cv::Size_<int>,class cv::Size_<int>)const " (?computeGradient@HOGDescriptor@cv@@UBEXABVMat@2@AAV32@1V?$Size_@H@2@2@Z)"

1>C:\Users\┼тухэшщ\Desktop\╧ЁюхъЄ√ C++\╧ЁюхъЄ√ яю OpenCV\├ЁрЇшўхёъшщ шэЄхЁЇхщё\1\Debug\1.exe : fatal error LNK1120: эхЁрчЁх°хээ√ї тэх°эшї ¤ыхьхэЄют: 24

========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========

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


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

ошибки линковки, скорее всего что то с библиотеками(старые или не подключены).

и да используйте английскую версию вижуал студии.

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


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

Обещанная статейка: attachicon.gifOpencv23Vs2010.pdf

 

Visual Studio 2013

OpenCV+MFC. Пытаюсь отладить программу (написана согласно методичке).

При отладке ругается:

 

2    IntelliSense: Предупреждение PCH:     d:\VISUAL STUDIO PROJECT\CVPROF\CVPROFDlg.cpp    1    1    CVPROF

1    error C4703: используется потенциально неинициализированная локальная переменная-указатель "App"    d:\visual studio project\cvprof\cvprofdlg.cpp    251    1    CVPROF

 

Код приведен ниже...

 

// CVPROFDlg.cpp : файл реализации
//

#include "stdafx.h"
#include "CVPROF.h"
#include "CVPROFDlg.h"
#include "afxdialogex.h"
#include "opencv2/opencv.hpp"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#define WIDTHBYTES(bits) ((((bits) + 31) / 32) * 4)
CStatic m_cap;
CvCapture*capture;
IplImage*frame;
CDC*cap_dc;
DWORD WINAPI InstanceThread(LPVOID);
DWORD dwThreadId = 0;
HANDLE hThread = NULL;
HBITMAP CreateRGBBitmap(IplImage* _Grab);
// Диалоговое окно CAboutDlg используется для описания сведений о приложении

class CAboutDlg : public CDialogEx
{
public:
	CAboutDlg();

// Данные диалогового окна
	enum { IDD = IDD_ABOUTBOX };

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // поддержка DDX/DDV

// Реализация
protected:
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()


// диалоговое окно CCVPROFDlg



CCVPROFDlg::CCVPROFDlg(CWnd* pParent /*=NULL*/)
	: CDialogEx(CCVPROFDlg::IDD, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CCVPROFDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_CAP_STATIC, m_cap);
}

BEGIN_MESSAGE_MAP(CCVPROFDlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDOK, &CCVPROFDlg::OnBnClickedOk)
	ON_WM_CLOSE()
END_MESSAGE_MAP()


// обработчики сообщений CCVPROFDlg

BOOL CCVPROFDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// Добавление пункта "О программе..." в системное меню.

	// IDM_ABOUTBOX должен быть в пределах системной команды.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		BOOL bNameValid;
		CString strAboutMenu;
		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
		ASSERT(bNameValid);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Задает значок для этого диалогового окна.  Среда делает это автоматически,
	//  если главное окно приложения не является диалоговым
	SetIcon(m_hIcon, TRUE);			// Крупный значок
	SetIcon(m_hIcon, FALSE);		// Мелкий значок

	// TODO: добавьте дополнительную инициализацию

	return TRUE;  // возврат значения TRUE, если фокус не передан элементу управления

	cap_dc = m_cap.GetDC();
	capture = cvCreateCameraCapture(CV_CAP_ANY);
	hThread = CreateThread(
		NULL, 
		0, 
		InstanceThread, 
		0, 
		0, 
		&dwThreadId); 
	assert(capture);
}

void CCVPROFDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialogEx::OnSysCommand(nID, lParam);
	}
}

// При добавлении кнопки свертывания в диалоговое окно нужно воспользоваться приведенным ниже кодом,
//  чтобы нарисовать значок.  Для приложений MFC, использующих модель документов или представлений,
//  это автоматически выполняется рабочей областью.

void CCVPROFDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // контекст устройства для рисования

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// Выравнивание значка по центру клиентского прямоугольника
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Нарисуйте значок
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialogEx::OnPaint();
	}
}

// Система вызывает эту функцию для получения отображения курсора при перемещении
//  свернутого окна.
HCURSOR CCVPROFDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}



void CCVPROFDlg::OnBnClickedOk()
{
	// TODO: добавьте свой код обработчика уведомлений
	CDialogEx::OnOK();
}


void CCVPROFDlg::OnClose()
{
	CloseHandle(hThread);
	cvReleaseCapture(&capture);
	ReleaseDC(cap_dc);
	CDialogEx:: OnClose();
}

//---------------------------------------------------------------------------
HBITMAP CreateRGBBitmap(IplImage* _Grab)
{
	char *App;
	IplImage *_Grab3 = 0, *_Grabf = 0;

	LPBITMAPINFO lpbi = new BITMAPINFO;

	lpbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	lpbi->bmiHeader.biWidth = _Grab->width;
	lpbi->bmiHeader.biHeight = _Grab->height;
	lpbi->bmiHeader.biPlanes = 1;
	lpbi->bmiHeader.biBitCount = 24;
	lpbi->bmiHeader.biCompression = BI_RGB;
	lpbi->bmiHeader.biSizeImage = WIDTHBYTES((DWORD)_Grab->width * 8) * _Grab->height;
	lpbi->bmiHeader.biXPelsPerMeter = 0;
	lpbi->bmiHeader.biYPelsPerMeter = 0;
	lpbi->bmiHeader.biClrUsed = 0;
	lpbi->bmiHeader.biClrImportant = 0;

	void *pBits;
	HBITMAP hBitmap = CreateDIBSection(NULL, lpbi, DIB_RGB_COLORS,
		(void **)&pBits, NULL, 0);
	delete lpbi;

	if (hBitmap)App = (char*)pBits;

	if (_Grab->depth != IPL_DEPTH_8U)
	{
		_Grabf = cvCloneImage(_Grab);
		if (_Grab)
		{
			cvReleaseImage(&_Grab);
		}
		_Grab = cvCreateImage(cvSize(_Grabf->width, _Grabf->height), IPL_DEPTH_8U, _Grabf->nChannels);
		cvConvert(_Grabf, _Grab);
		if (_Grabf)
		{
			cvReleaseImage(&_Grabf);
		}
	}

	if (_Grab->nChannels == 1)
	{
		_Grab3 = cvCreateImage(cvSize(_Grab->width, _Grab->height), IPL_DEPTH_8U, 3);
		cvMerge(_Grab, _Grab, _Grab, NULL, _Grab3);
	}

	if (_Grab->nChannels == 3)
	{
		_Grab3 = _Grab;
	}

	unsigned char *data;
	cvGetRawData(_Grab3, (uchar**)&data);

	if (_Grab3)
	{
		for (int i = 0; i < _Grab->height; i++)
		{
			memcpy(App + _Grab3->widthStep*(_Grab3->height - i - 1), data + _Grab3->widthStep*i, _Grab3->width * 3);
		}
	}

	if (_Grab->nChannels == 1)
	{
		cvReleaseImage(&_Grab3);
	}

	return hBitmap;
}
//----------------------------------------------------------------------------------
void DrawData(IplImage*_frame, CDC*dc)
{
	RECT r;
	dc->GetClipBox(&r);
	int width = r.right-r.left;
	int height = r.bottom-r.top;
	IplImage *img = cvCreateImage(cvSize(width, height), _frame->depth, _frame->nChannels);
	cvResize(_frame, img);
	HBITMAP pBitmap;
	pBitmap = CreateRGBBitmap(img);
	HDC hMemDC = CreateCompatibleDC(dc->m_hDC);
	HGDIOBJ hOldBm = SelectObject(hMemDC, pBitmap);
	BitBlt(dc->m_hDC, 0, 0, width, height, hMemDC, 0, 0, SRCCOPY);
	SelectObject(hMemDC, hOldBm);
	DeleteDC(hMemDC);
	DeleteObject(pBitmap);
	cvReleaseImage(&img);
}

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


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

Думаю это решается путем инициализации App. Присвойте App=NULL при объявлении.

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


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

Думаю это решается путем инициализации App. Присвойте App=NULL при объявлении.

 

Да, инициализировал. Помогло. Нашел еще пару ошибок. Получилось все как в методичке.

Удалось собрать проект. Но при запуске .exe возникли проблемы:

 

1. При запуске открывается форма. Загорается светодиод камеры (т.е. подключение к камере осуществляется), но при этом на форме лишь серый прямоугольник. После нескольких секунд появляется сообщение (см.рис.1).

 

post-1271-0-53004500-1427141214_thumb.jp

 

Закрываю программу.

 

2. Когда пытаюсь запустить снова, появляется окно выбора камеры (см.рис.2).

 

post-1271-0-62671600-1427141220_thumb.jp

 

Выбираю камеру. Жму ОК.

 

3. Тут же прилетает ошибка (см.рис.3)

 

post-1271-0-91757500-1427141225_thumb.jp

 

Строка 289 на которую ссылается окно с ошибкой в следующем участке кода:

BOOL CCVPROFDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// Добавление пункта "О программе..." в системное меню.

	// IDM_ABOUTBOX должен быть в пределах системной команды.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		BOOL bNameValid;
		CString strAboutMenu;
		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
		ASSERT(bNameValid);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Задает значок для этого диалогового окна.  Среда делает это автоматически,
	//  если главное окно приложения не является диалоговым
	SetIcon(m_hIcon, TRUE);			// Крупный значок
	SetIcon(m_hIcon, FALSE);		// Мелкий значок

	// Чтобы каждый раз не обращаться
	// Освобождаемся в функции закрытия формы	

	cap_dc = m_cap.GetDC();
	capture = cvCaptureFromCAM(0);
	
	// Создаем поток захвата видео
	hThread = CreateThread(
		NULL,
		0,
		InstanceThread,
		0,
		0,
		&dwThreadId); 
	assert(capture);

	return TRUE;  // возврат значения TRUE, если фокус не передан элементу управления
}

т.е. проблема в assert(capture); Что это может быть?

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


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

Видимо камера не открылась, или assert сработал не как задумано автором. 

Попробуйте закомментировать assert.

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


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

Видимо камера не открылась, или assert сработал не как задумано автором. 

Попробуйте закомментировать assert.

 

Закоментировал. Ошибка со ссылкой на assert пропала. Теперь просто программа запускается и сразу появляется окно Windows "Прекращена работа программы"...Камера молчит...

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


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

Есть подозрение что камера не поддерживается. 

Попробуйте считать изображение из файла и вывести его.

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×