R
rs4i
Собственно, название темы. Как?
К сожалению, я не силен в графике и с соответствующими библиотеками знаком слабо.
Думал использовать OpenGL, нашел красивый код:
Выдает чёрный квадрат.
Заставить работать не удалось.
Пробовал Win32api, наворочал костылей, получил тормоза.
Вот кривой и тормозной, но рабочий код:
Пробовал задействовать GetDIBits, картинка скосилась.
Видимо в Bitmap строки выровнены по границе слова (кратны 4).
Подскажите пожалуйста
1. Как заставить работать glReadPixels (или другую функцию OpenGL) с экраном Windows.
2. Как заставить GDI BitBlt или GetDIBits копировать данные в cv::Mat с учетом выравнивания строк.
Добавлено: Сожалею что создал одинаковые темы.
Какой-то глюк форума.
При создании темы выдавало ошибку.
К сожалению, я не силен в графике и с соответствующими библиотеками знаком слабо.
Думал использовать OpenGL, нашел красивый код:
C++:
//glReadBuffer( GL_FRONT );
cv::Mat img( 200, 200, CV_8UC3 );
glPixelStorei( GL_PACK_ALIGNMENT, ( img.step & 3 )? 1: 4 );
glPixelStorei( GL_PACK_ROW_LENGTH, img.step/img.elemSize() );
glReadPixels( 0, 0, img.cols, img.rows, GL_BGR_EXT, GL_UNSIGNED_BYTE, img.data );
//cv::Mat flipped( img );
//cv::flip( img, flipped, 0 );
//cv::imwrite( "C:\\Projects\\OpenCV\\snapshot.png", img );
Заставить работать не удалось.
Пробовал Win32api, наворочал костылей, получил тормоза.
Вот кривой и тормозной, но рабочий код:
C++:
std::auto_ptr< cv::Mat > getScreen(){
HWND hDW = GetDesktopWindow();
HDC hDWDC = GetWindowDC( hDW );
RECT rect; GetWindowRect( hDW, &rect );
unsigned width = rect.right;
unsigned height = rect.bottom;
HDC hScreen = CreateCompatibleDC( hDWDC );
HBITMAP hBM = CreateCompatibleBitmap( hDWDC, width, height );
HGDIOBJ temp = SelectObject( hScreen, hBM );
BitBlt( hScreen, 0, 0, width, height, hDWDC, 0, 0, SRCCOPY );
std::auto_ptr< cv::Mat > screen( new cv::Mat( height, width, CV_8UC3 ) );
for( unsigned y = 0; y < height; ++y )
for( unsigned x = 0; x < width; ++x ){
COLORREF color = GetPixel( hScreen, x, y );
screen->data[ ( y * screen->cols + x ) * screen->elemSize() + 0 ] = GetBValue( color ); // B
screen->data[ ( y * screen->cols + x ) * screen->elemSize() + 1 ] = GetGValue( color ); // G
screen->data[ ( y * screen->cols + x ) * screen->elemSize() + 2 ] = GetRValue( color ); // R
}
// нужно поудалять созданные объекты!!!
return screen;
}
Пробовал задействовать GetDIBits, картинка скосилась.
Видимо в Bitmap строки выровнены по границе слова (кратны 4).
C++:
BITMAPINFO BMI; ZeroMemory( &BMI, sizeof BMI );
BMI.bmiHeader.biSize = sizeof( BITMAPINFOHEADER );
BMI.bmiHeader.biWidth = width;
BMI.bmiHeader.biHeight = -height;
BMI.bmiHeader.biPlanes = 1;
BMI.bmiHeader.biBitCount = 24;
BMI.bmiHeader.biCompression = BI_RGB;
int result = GetDIBits( hScreen, hBM, 0, height, screen->data, &BMI, DIB_RGB_COLORS );
Подскажите пожалуйста
1. Как заставить работать glReadPixels (или другую функцию OpenGL) с экраном Windows.
2. Как заставить GDI BitBlt или GetDIBits копировать данные в cv::Mat с учетом выравнивания строк.
Добавлено: Сожалею что создал одинаковые темы.
Какой-то глюк форума.
При создании темы выдавало ошибку.