QCamera рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡реЗрдм рдХреИрдорд░рд╛ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рдирд╛

рд╣рд╛рдп, рд╣реЗрдмреНрд░!

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рддрд╣рдд Qt5 рд╕реЗ рдПрдХ рд╡реЗрдмрдХреЗрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ (рд▓реЗрдХрд┐рди рдЙрджрд╛рд╣рд░рдг рднреА рд▓рд┐рдирдХреНрд╕ рдФрд░ рдореИрдХ рдУрдПрд╕ рдПрдХреНрд╕ рдХреЗ рддрд╣рдд рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдореЗрдВ gstreamer рдкреНрд▓рдЧрдЗрди рд╕реНрдерд╛рдкрд┐рдд рд╣реИ)ред



рдпрджрд┐ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЖрд╡реЗрджрди рдХреИрд╕реЗ рдХрд░реЗрдВ рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рджреВрд░ рдХрд░реЗрдВ, рддреЛ рдореИрдВ рдмрд┐рд▓реНрд▓реА рдХреЗ рд▓рд┐рдП рдкреВрдЫрддрд╛ рд╣реВрдВред

рдкреНрд░рд╛рдЧрд┐рддрд┐рд╣рд╛рд╕


рдПрдХ рдмрд╛рд░ рдЬрдм рдореИрдВ рдЕрдкрдиреЗ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдХреЗ рд▓рд┐рдП рд╡реЗрдм рдХреИрдорд░рд╛ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ (рдЬреЛ, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдХрд╛рдлреА рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдирд╣реАрдВ рд╣реИ)ред рдЪреВрдБрдХрд┐ рдореИрдВрдиреЗ рдЙрд╕ рд╕рдордп Qt4 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рддрд▓рд╛рд╢ рд╢реБрд░реВ рдХрд░ рджреА, рд▓реЗрдХрд┐рди рддрдм рдпреВрд░реЗрд▓реЗрдпрд░ рдиреЗ рдореБрдЭреЗ рдмрддрд╛рдпрд╛ рдХрд┐ Qt5 рдореЗрдВ QCamera рд╡рд░реНрдЧ рд╣реИ рдЬреЛ рдореЗрд░реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЕрдиреБрдХреВрд▓ рд╣реИред
рдпрд╣ Qt5 рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдЕрднреА рднреА рдЕрд▓реНрдлрд╛ рд░рд╛рдЬреНрдп рдореЗрдВ рдерд╛ (рдФрд░ рдЕрдм рдХреЗрд╡рд▓ рдкреВрд░реНрд╡-рдмреАрдЯрд╛)ред

рдкрд╣рд▓реА рд╕рдорд╕реНрдпрд╛рдПрдВ


рдкрд╣рд▓реА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рд╢реБрд░реВ рд╣реБрдИрдВред рдХреБрдЯрд┐рд▓ рд▓рд┐рдкрд┐рдпреЛрдВ / рдЧрд╛рдЗрдбреЛрдВ рдХреЗ рдХрд╛рд░рдг, рдХреНрд╡реЗрдЯрдмрд┐рдЯрдХ рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВ рдПрдХ рд╢рд╛рдо рдЦреЛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдкреВрд░реЗ рдврд╛рдВрдЪреЗ рдХреЛ рдбрд┐рдмрдЧ рдФрд░ рд░рд┐рд▓реАрдЬрд╝ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред
QtMultimedia рдХреЗ рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдЬрд╛рдиреЗ рдФрд░ рд╡рд╣рд╛рдВ рдХреИрдорд░рд╛ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдФрд░ рджреЗрдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдлрд┐рд░ рдПрдХ рджреВрд╕рд░реА рд╕рдорд╕реНрдпрд╛ рдиреЗ рдореЗрд░рд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд┐рдпрд╛:


рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдХрд┐рд╕реА рддрд░рд╣ рдХрд╛ рдкреНрд▓рдЧрдЗрди рдЧрд╛рдпрдм рд╣реИред рдЗрд╕реЗ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ QtMultimedia \ src \ plugins рдореЗрдВ рдЪрдврд╝ рдЧрдпрд╛ред рд╡рд╣рд╛рдБ рдореЗрд░реА рдирдЬрд╝рд░ рдкрд╣рд▓реЗ рдЧреЙрд╕реНрдЯрдорд░ рдкрд░ рдкрдбрд╝реА, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдЬрд▓реНрджреА рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдЗрд╕реЗ рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рддрд╣рдд рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рддрдм рдореБрдЭреЗ рд╡рд╣рд╛рдВ рдПрдХ рдЕрдзреВрд░рд╛ рдирд┐рд░реНрджреЗрд╢рди рдорд┐рд▓рд╛ред

рд╕реАрдзрд╛ рд╢реЛ


рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ QtBase \ plugins \ mediaservice рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХреЗ рдмрд╛рдж , рдореИрдВрдиреЗ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ QtMultimedia рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЪрд▓рд╛рдпрд╛, рдЬрд┐рд╕рдореЗрдВ рдХреИрдорд░реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рджрд┐рдЦрд╛рдИ рдЧрдИ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рдЫрд╡рд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рднреА рдХреЛрд╢рд┐рд╢ рдХреА рдЧрдИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмреБрд░реА рддрд░рд╣ рд╕реЗ рдФрд░ рдзрд╛рд░реАрджрд╛рд░ рдирд┐рдХрд▓рд╛:


рдЗрд╕ рдкрд░ рдереВрдХрдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдЕрдкрдирд╛ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛, рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореБрдЭреЗ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред рдФрд░ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╣рд╛рдБ рдирд╣реАрдВ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрд▓рдЧ рдерд╛: рдЫрд╡рд┐ рд╕рдВрдХрд▓реНрдк рд╣рдореЗрд╢рд╛ 320x240 рдерд╛ред рдкреНрд▓рдЧрдЗрди рдХреЗ рдбрд╛рдпрд░реЗрдХреНрдЯрд╢реЛ рдХреЛрдб рдХреЗ рдереЛрдбрд╝реЗ рд╕рдордп рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдХрд▓ рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЛрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдЕрдЧрд▓реЗ рджрд┐рди рдлрд┐рд░ рд╕реЗ рдирд┐рд░реНрджреЗрд╢рди рдХреЗ рд╕рд╛рде рдХреЛрдИ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рд▓рд╛рдпрд╛, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдХреЛрдб рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ред рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдмрдЪреА рдереА -

рдЕрдЧрд▓реЗ рджрд┐рди рдореБрдЭреЗ рдПрдХ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдорддреМрд░ рдкрд░ рдРрд╕реА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ рдХрд╛рдлреА рд╕рд░рд▓ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реИред рдХреЛрдб рдореЗрдВ, updateProperties () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд╣реАрдВ рднреА рдирд╣реАрдВ рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рд╕рдорд░реНрдерд┐рдд рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рдерд╛, рдФрд░ 320x240 рдЖрдХрд╛рд░ рднреА рд╡рд░реНрдЧ рдирд┐рд░реНрдорд╛рддрд╛ рдореЗрдВ рд╣рд╛рд░реНрдбрдХреЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдФрд░ рдЗрд╕рдХреА рдХреЙрд▓ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдЕрдзрд┐рдХрддрдо рд╕рдВрднрд╡ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдХреА рдЫрд╡рд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред

рд╕реБрдзрд╛рд░
1) рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ QtMultimedia \ src \ plugins \ directshow \ рдХреИрдорд░рд╛ \ dscamerasession.cpp ред
2) рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ DSCameraSession :: setDevice (...) рдмрд╣реБрдд рдЕрдВрдд рдореЗрдВ, рдЕрдкрдбреЗрдЯрдкреНрд░реЛрдкрд░реЗрдЯреНрд╕ () рдЬреЛрдбрд╝реЗрдВ ; ред
3) updateProperties ( ) рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
void DSCameraSession::updateProperties() { HRESULT hr; AM_MEDIA_TYPE *pmt = NULL; VIDEOINFOHEADER *pvi = NULL; VIDEO_STREAM_CONFIG_CAPS scc; IAMStreamConfig* pConfig = 0; hr = pBuild->FindInterface(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,pCap, IID_IAMStreamConfig, (void**)&pConfig); if (FAILED(hr)) { qWarning()<<"failed to get config on capture device"; return; } int iCount; int iSize; hr = pConfig->GetNumberOfCapabilities(&iCount, &iSize); if (FAILED(hr)) { qWarning()<<"failed to get capabilities"; return; } QList<QSize> sizes; QVideoFrame::PixelFormat f = QVideoFrame::Format_Invalid; types.clear(); resolutions.clear(); for (int iIndex = 0; iIndex < iCount; iIndex++) { hr = pConfig->GetStreamCaps(iIndex, &pmt, reinterpret_cast<BYTE*>(&scc)); if (hr == S_OK) { pvi = (VIDEOINFOHEADER*)pmt->pbFormat; if ((pmt->majortype == MEDIATYPE_Video) && (pmt->formattype == FORMAT_VideoInfo)) { // Add types if (pmt->subtype == MEDIASUBTYPE_RGB24) { if (!types.contains(QVideoFrame::Format_RGB24)) { types.append(QVideoFrame::Format_RGB24); f = QVideoFrame::Format_RGB24; } } else if (pmt->subtype == MEDIASUBTYPE_RGB32) { if (!types.contains(QVideoFrame::Format_RGB32)) { types.append(QVideoFrame::Format_RGB32); f = QVideoFrame::Format_RGB32; } } else if (pmt->subtype == MEDIASUBTYPE_YUY2) { if (!types.contains(QVideoFrame::Format_YUYV)) { types.append(QVideoFrame::Format_YUYV); f = QVideoFrame::Format_YUYV; } } else if (pmt->subtype == MEDIASUBTYPE_MJPG) { } else if (pmt->subtype == MEDIASUBTYPE_I420) { if (!types.contains(QVideoFrame::Format_YUV420P)) { types.append(QVideoFrame::Format_YUV420P); f = QVideoFrame::Format_YUV420P; } } else if (pmt->subtype == MEDIASUBTYPE_RGB555) { if (!types.contains(QVideoFrame::Format_RGB555)) { types.append(QVideoFrame::Format_RGB555); f = QVideoFrame::Format_RGB555; } } else if (pmt->subtype == MEDIASUBTYPE_YVU9) { } else if (pmt->subtype == MEDIASUBTYPE_UYVY) { if (!types.contains(QVideoFrame::Format_UYVY)) { types.append(QVideoFrame::Format_UYVY); f = QVideoFrame::Format_UYVY; } } else { qWarning() << "UNKNOWN FORMAT: " << pmt->subtype.Data1; } // Add resolutions QSize res(pvi->bmiHeader.biWidth, pvi->bmiHeader.biHeight); if (!resolutions.contains(f)) { sizes.clear(); resolutions.insert(f,sizes); } resolutions[f].append(res); if ( m_windowSize.width() < res.width() && m_windowSize.height() < res.height() ) m_windowSize = res; } } } pConfig->Release(); pixelF = QVideoFrame::Format_RGB24; actualFormat = QVideoSurfaceFormat(m_windowSize,pixelF); } 

рдЕрдм рд╣рдо рдХреЛрдб рдХреЛ рд╕реАрдзреЗ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред

Qt5 рдореЗрдВ рдПрдХ рд╡реЗрдм рдХреИрдорд░рд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛


рдЪреВрдВрдХрд┐ рдЙрджрд╛рд╣рд░рдг рдЫреЛрдЯрд╛ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рд╕рднреА рд╕реНрд▓реЙрдЯ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ред

рд╣рдо рдирдП рдирдП рд╕рд╛рдБрдЪреЗ рдЦреАрдВрдЪрддреЗ рд╣реИрдВ


рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЪрд▓реЛ рдбрд┐рдЬрд╛рдЗрдирд░ рдореЗрдВ рджреЛ рдЫреЛрдЯреЗ рд░реВрдкреЛрдВ рдХреЛ рд╕реНрдХреЗрдЪ рдХрд░реЗрдВред

webcam.ui - рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореБрдЦреНрдп рдЦрд┐рдбрд╝рдХреА:


webcamselect.ui - рдЕрдЧрд░ рдЙрдирдореЗрдВ рд╕реЗ рдХрдИ рд╣реИрдВ, рддреЛ рдПрдХ рд╡реЗрдмрдХреИрдо рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ:


рд╣реИрдбрд░ рдлрд╝рд╛рдЗрд▓


рдпрд╣рд╛рдВ рдореИрдВ рд╕рд┐рд░реНрдл рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдХреЛрдб рджреЗрддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИред

webcam.h
 #ifndef WEBCAM_H #define WEBCAM_H #include <QtGui/QClipboard> #include <QtMultimedia/QtMultimedia> #include <QtMultimediaWidgets/QtMultimediaWidgets> #include <QtWidgets/QtWidgets> #include "ui_webcam.h" #include "ui_webcamselect.h" class webCam : public QWidget { Q_OBJECT public: webCam(); ~webCam(); bool nativeEvent( QByteArray ba, void *message, long *result ); public slots: void cameraError( QCamera::Error value ); void cameraStateChanged( QCamera::State state ); void capture( bool checked = false ); protected: void mouseMoveEvent( QMouseEvent* event ); void mousePressEvent( QMouseEvent* event ); void paintEvent( QPaintEvent *event ); void resizeEvent( QResizeEvent *event ); private: Ui::webCamClass ui; Ui::webCamSelectClass select_ui; QPoint m_drag_pos; static QByteArray m_defaultDevice; QDialog *m_selectDialog; QPointer< QCamera > m_camera; QPointer< QCameraImageCapture > m_imageCapture; QPixmap m_pixmap; QTimer *m_timer; int m_timerPaintState; }; 


рдХреИрдорд░рд╛ рдЪрдпрди


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк webcam.h рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ m_defaultDevice рдирд╛рдордХ рдХрдХреНрд╖рд╛ рдореЗрдВ рдПрдХ рд╕реНрдерд┐рд░ рд╕рджрд╕реНрдп рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╕реЗ рдкрд╣рд▓реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ:
 QByteArray webCam::m_defaultDevice = QByteArray(); 

QCamera :: availableDevices () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП , рд╕реНрд╡рдпрдВ рдирд┐рд░реНрдорд╛рддрд╛ рдореЗрдВ, рд╣рдо рдХреИрдорд░реЛрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣рдорд╛рд░рд╛ m_defaultDevice рдЗрд╕ рд╕реВрдЪреА рдореЗрдВ рд╣реИред рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдФрд░ рддрд░реАрдХреЗ рд╣реЛрдВрдЧреЗ:
1) рдпрджрд┐ рдбрд┐рд╡рд╛рдЗрд╕ рд╕реВрдЪреАрдмрджреНрдз рд╣реИ, рддреЛ рдмрд╕ рдЗрд╕ рдЪрд░рдг рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВред
2) рдпрджрд┐ рдпрд╣ рдирд╣реАрдВ рдерд╛, рддреЛ рдЖрдкрдХреЛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрд╡рд╛рдж рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рдХреЛрдИ рд╡реЗрдмрдХреИрдо рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдмрд╕ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╣реИ, рддреЛ рдЗрд╕реЗ рдЪреБрдиреЗрдВред

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХрдИ рд╡реЗрдмрдХреИрдо рд╣реИрдВ, рддреЛ рдПрдХ рдЪрдХреНрд░ рдореЗрдВ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рд╡реЗрдм рдХреИрдорд░рд╛ рдХреЗ рд▓рд┐рдП рдмрдЯрди рдмрдирд╛рдПрдВрдЧреЗ рдФрд░ рдПрдХ рд╕рдВрд╡рд╛рдж рджрд┐рдЦрд╛рдПрдВрдЧреЗ:
 foreach( QByteArray webCam, cams ) { auto commandLinkButton = new QCommandLinkButton( QCamera::deviceDescription( webCam ) ); commandLinkButton->setProperty( "webCam", webCam ); connect( commandLinkButton, &QCommandLinkButton::clicked, [=]( bool ) { m_defaultDevice = commandLinkButton->property( "webCam" ).toByteArray(); m_selectDialog->accept(); } ); select_ui.verticalLayout->addWidget( commandLinkButton ); } if ( m_selectDialog->exec() == QDialog::Rejected ) { deleteLater(); return; } 

рдирдП рд╕рд┐рдЧреНрдирд▓-рд╕реНрд▓реЙрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдпрд╣рд╛рдВ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреВрд░реЗ рд╡рд░реНрдЧ рдореЗрдВ рдХреЛрдб рдХреЛ рдзрдмреНрдмрд╛ рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬреЛ рдореИрдВрдиреЗ рдХрд┐рдпрд╛ рдерд╛ред

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдпрд╛ рддреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рдЬрд╛рдПрдЧрд╛ (рдЙрд╕рдиреЗ рдХреНрд░реЙрд╕ рдХреЛ рдХреНрд▓рд┐рдХ рдХрд┐рдпрд╛) рдпрд╛ m_defaultDevice рдореЗрдВ рд╣рдорд╛рд░реЗ рдбрд┐рд╡рд╛рдЗрд╕ рдХреА рдЖрдИрдбреА рд╣реЛрдЧреАред

QCamera рдФрд░ QCameraViewfinder рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ


рдЗрди рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдмрдирд╛рддреЗ рд╕рдордп, рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рд╣рдо рдХреИрдорд░рд╛ рдХреИрдорд░рд╛ рдХреЛ QCamera рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдкрд╛рд╕ рднреЗрдЬрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдПрд░рд░ рдФрд░ рд╕реНрдЯреЗрдЯрд╕ рдЪреЗрдВрдЬ рд╕реНрд▓реЙрдЯреНрд╕ рд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:
 m_camera = new QCamera( m_defaultDevice ); connect( m_camera, SIGNAL( error( QCamera::Error ) ), this, SLOT( cameraError( QCamera::Error ) ) ); connect( m_camera, SIGNAL( stateChanged( QCamera::State ) ), this, SLOT ( cameraStateChanged( QCamera::State ) ) ); 


QCameraViewfinder рдПрдХ рдРрд╕реА рд╡рд╕реНрддреБ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рд╕реАрдзреЗ рд╡реЗрдмрдХреИрдо рд╕реЗ рдЫрд╡рд┐ рдХреЛ рд╡рд┐рдЬреЗрдЯ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ (рдХреНрдпрд╛ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрд╡рдпрдВ рдиреЗрддреНрд░рд╣реАрди рдлреЛрдЯреЛ рди рдЦреАрдВрдЪреЗ?)ред

рд╣рдо рдиреНрдпреВрдирддрдо рдЖрдХрд╛рд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ (рдЕрдиреНрдпрдерд╛ рд╣рдорд╛рд░рд╛ рд╡рд┐рдЬреЗрдЯ рдХрдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ) рдФрд░ рдХреИрдорд░рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ:
 auto viewfinder = new QCameraViewfinder; viewfinder->setMinimumSize( 50, 50 ); m_camera->setViewfinder( viewfinder ); m_camera->setCaptureMode( QCamera::CaptureStillImage ); 

( QCamera :: CaptureStillImage рдкреИрд░рд╛рдореАрдЯрд░ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред)

UI рдФрд░ рдЯрд╛рдЗрдорд░ рдмрдЯрди рд╕реЗрдЯ рдХрд░рдирд╛


рдПрдХ рдирдпрд╛ рд▓реЗрдмрд▓ рдмрдирд╛рдПрдВ рдЬреЛ рдЪрд┐рддреНрд░ рдХреЗ рдКрдкрд░ рдФрд░ рдиреАрдЪреЗ рдХреА рдУрд░ рдЦреАрдВрдЪрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЪрд░ рд╣реЛрдЧрд╛:
 auto timerLabel = new QLabel; QString timerLabelTpl = "<p align=\"center\"><span style=\"font-size:50pt; font-weight:600; color:#FF0000;\">%1</span></p>"; 


рдФрд░ рдЗрд╕реЗ рджреГрд╢реНрдпрджрд░реНрд╢реА рдкрд░ рд░рдЦреЗрдВ:
 ui.gridLayout_3->addWidget( viewfinder, 0, 0 ); ui.gridLayout_3->addWidget( timerLabel, 0, 0 ); 

рдЕрдЧрд▓рд╛, рд╣рдо рдПрдХ рдЯрд╛рдЗрдорд░ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдХрд╛рдЙрдВрдЯрдбрд╛рдЙрди рдФрд░ рдЗрд╕рдХреЗ рд╕реНрд▓реЙрдЯ рдХреЗ рдмрд╛рдж рд╢реБрд░реВ рд╣реЛрдЧрд╛:
 m_timerPaintState = 0; m_timer = new QTimer( this ); m_timer->setInterval( 1000 ); connect( m_timer, &QTimer::timeout, [=]() { m_timerPaintState--; if ( m_timerPaintState ) { timerLabel->setText( timerLabelTpl.arg( QString::number( m_timerPaintState ) ) ); } else { m_timer->stop(); timerLabel->hide(); capture(); } } ); 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХреЛрдб рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдЧрд░ рдЕрднреА рднреА рд╕рдордп рд╣реИ, рддреЛ рдмрд╕ рдЗрд╕реЗ рдПрдХ рд╕реЗрдХрдВрдб рд╕реЗ рдХрдо рдХрд░реЗрдВ, рдФрд░ рдпрджрд┐ рдпрд╣ рдЦрддреНрдо рд╣реЛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╣рдо рдЪрд┐рддреНрд░ рд▓реЗрддреЗ рд╣реИрдВ, рдЯрд╛рдЗрдорд░ рдмрдВрдж рдХрд░ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдХрд╛рдЙрдВрдЯрд░ рдЫрд┐рдкрд╛рддреЗ рд╣реИрдВред

рдирд┐рдпрдВрддреНрд░рдг рдмрдЯрди рд╕реНрд▓реЙрдЯ


рдЪреВрдВрдХрд┐ рдЙрди рд╕рднреА рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рдореИрдВ рдЗрд╕реЗ рдпрд╣рд╛рдВ рдирд╣реАрдВ рджреВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ QClipboard рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрдж рдХрд╣реВрдВрдЧрд╛:
 connect( ui.copyButton, &QPushButton::clicked, [=]( bool ) { QApplication::clipboard()->setImage( m_pixmap.toImage() ); } ); 

рдХреНрдпреВрдЯреА рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдпрд╣ рдХрд╛рдлреА рдЕрдЬреАрдм рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ: рдпрд╣ рдЫрд╡рд┐ рдХреЛ рдмрдлрд░ рдореЗрдВ рдирд╣реАрдВ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИ (рдпрд╣ рд╢рд╛рдпрдж рд╣реА рдХрднреА рд╣реЛрддрд╛ рд╣реИ), рдпрд╛, рдЬрдмрдХрд┐ рдпрд╣ рд╡рд╣рд╛рдВ рд╕реЗ рдирд┐рдХрд▓ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕реЗ рдЦрд░рд╛рдм рдХрд░ рджреЗрддрд╛ рд╣реИред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд░рд┐рд▓реАрдЬ рдХреЗ рд▓рд┐рдП рддрдп рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рдЫрд╡рд┐ рдкрд░ рдХрдмреНрдЬрд╛


 m_camera->start(); m_imageCapture = new QCameraImageCapture( m_camera ); //m_imageCapture->setCaptureDestination( QCameraImageCapture::CaptureToBuffer ); m_imageCapture->setCaptureDestination( QCameraImageCapture::CaptureToFile ); 

рд╣рдо рдХреИрдорд░реЗ рдХреЛ рдЪрд╛рд▓реВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ QCameraImageCapture рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдмрдлрд░ ( QCameraImageCapture :: CaptureToBuffer ) рдХреЛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдпрд╣ рд╡реИрд╕реЗ рднреА рдлрд╝рд╛рдЗрд▓ рдХреЛ рд▓рд┐рдЦрддрд╛ рд╣реИред

ImageSaved () рд╕реНрд▓реЙрдЯ рд▓рдЧрднрдЧ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдЫрд╡рд┐ () рдХреЛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░рддрд╛ рд╣реИ , рдЗрд╕рд▓рд┐рдП рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдХреЗрд╡рд▓ рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ред

 connect( m_imageCapture, &QCameraImageCapture::imageSaved, [=]( int id, const QString &fileName ) { QFile imageFile( fileName ); if ( imageFile.exists() ) { m_pixmap = QPixmap::fromImage( QImage( fileName ).mirrored( true, false ) ); ui.picture->setPixmap( m_pixmap.scaled( ui.picture->width(), ui.picture->height(), Qt::KeepAspectRatio ) ); imageFile.remove(); } else { QMessageBox::critical( this, "Error", "Image file are not found!" ); deleteLater(); return; } } ); 

рдЙрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЦреЛрд▓реЗрдВ рдЬрд┐рд╕рдореЗрдВ рдХреИрдорд░рд╛ рдиреЗ рдЫрд╡рд┐ рдХреЛ рд░рдЦрд╛ рд╣реИ, рдФрд░ рдЙрд╕рдореЗрдВ рд╕реЗ рдЫрд╡рд┐ рдкрдврд╝реЗрдВ, рдЬрд┐рд╕реЗ рд╣рдо рддрдм рджрд░реНрдкрдг рдФрд░ m_pixmap рдореЗрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░, рдЖрдХрд╛рд░ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рдпрд╛ рд╕рдВрдкреАрдбрд╝рд┐рдд рдХрд░рддреЗ рд╣реБрдП, QLabel рдЪрд┐рддреНрд░ рдореЗрдВред рд╣рдо рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдХреВрдбрд╝реЗ рди рд╣реЛрдВред

рд╕рдорд╛рд░реЛрд╣ рдкрд░ рдХрдмреНрдЬрд╛


рдХреИрдкреНрдЪрд░ рдлрд╝рдВрдХреНрд╢рди, рдЕрдиреНрдп рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреА рддрд░рд╣, рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ 3 рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рд╛рдЗрдиреЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

 void webCam::capture( bool ) { m_camera->searchAndLock(); m_imageCapture->capture( QCoreApplication::applicationDirPath() + "/image.jpg" ); m_camera->unlock(); ui.captureButton->setEnabled( true ); ui.timerButton->setEnabled( true ); } 


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХреИрдорд░реЗ рдХреЛ рдлреЛрдХрд╕ рдФрд░ рд▓реЙрдХ рдХрд░реЗрдВред рд▓реЙрдХрд┐рдВрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдПрдХ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рддрд╕реНрд╡реАрд░ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХреА рдЧрдИ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдмрджрд▓рдирд╛ рд╢реБрд░реВ рди рдХрд░реЗред
рджреВрд╕рд░реЗ, рд╣рдо рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реНрдиреИрдкрд╢реЙрдЯ рд▓реЗрддреЗ рд╣реИрдВред
рддреАрд╕рд░рд╛, рдХреИрдорд░рд╛ рдЕрдирд▓реЙрдХ рдХрд░реЗрдВред

рдмрд╛рдХреА рдХрд╛рд░реНрдп рд░реБрдЪрд┐ рдХреЗ рдирд╣реАрдВ рд╣реИрдВ рдФрд░, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдЙрди рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖


рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ Qt5 рдЕрднреА рднреА рдмреАрдЯрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рдПрдХ рд╡реЗрдмрдХреИрдо рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХреБрдЫ рдЖрд░рдХреНрд╖рдг рдФрд░ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

рдЖрд╡реЗрджрди рд╕реНрд░реЛрдд рдпрд╣рд╛рдВ рд╕реЗ рд▓рд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ ред
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░рддрд╛ рд╣реИред

(рдЪреВрдВрдХрд┐ рдпрд╣ рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рд▓реЗрдЦ рд╣реИ, рдХреГрдкрдпрд╛ рдореБрдЭреЗ рд╕рднреА рдЯрд╛рдЗрдкреЛ рдФрд░ рдбрд┐рдЬрд╝рд╛рдЗрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреАрдПрдо рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░реЗрдВред)

Source: https://habr.com/ru/post/In148775/


All Articles