मैंने सोचा कि एमएफसी व्यू पर ओपनसीवी 2 मैट प्रदर्शित करना सरल है लेकिन नहीं है। This is only relevant material I found on google। मुझे अपनी अज्ञानता के लिए क्षमा करें, लेकिन मुझे कोई अन्य सामग्री नहीं मिल रही है जो एक आयामी सरणी "डेटा" सदस्य रिटर्न के साथ SetDIBitsToDevice का उपयोग करने का तरीका दिखाती है। अधिक विशेष रूप से, मुझे यह जानने की जरूरत है कि फ़ंक्शन के लिए BITMAPINFO को कैसे निर्दिष्ट किया जाए। क्या मैं एमएफसी के साथ काम करने के लिए ओल्ड सी-स्टाइल ओपनसीवी पर वापस जाता हूं?एमएफसी व्यू पर ओपनसीवी मैट को प्रदर्शित करने के लिए कैसे करें
अद्यतन:
मैं an example of SetDIBitsToDevice जो पुराने सी-शैली OpenCV के लिए वास्तव में है पाया। लेकिन यह OpenCV2 के लिए इसे परिवर्तित करने के लिए सीधा था। कुछ चीजें मैं बनाने के लिए उल्लेख करने की जरूरत है यह काम कर रहे हैं:
बीपीपी विधि चटाई की गहराई के रूप में अच्छी तरह से काम नहीं करता है देता है 0. मैं सिर्फ इस तरह बदल दिया है:
static int Bpp(cv::Mat img) { return 8 * img.channels(); }
चटाई मूल नहीं है सदस्य। लेकिन FillBitmapInfo विधि के मूल तर्क के लिए बस 0 डालना ठीक है।
इसके अलावा, कोड बहुत अच्छा काम करता है। उम्मीद है कि यह अन्य देवताओं की भी मदद करता है।
void COpenCVTestView::OnDraw(CDC* pDC)
{
COpenCVTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
if(pDoc->m_cvImage.empty()) return;
// TODO: add draw code for native data here
int height=pDoc->m_cvImage.rows;
int width=pDoc->m_cvImage.cols;
uchar buffer[sizeof(BITMAPINFOHEADER) + 1024];
BITMAPINFO* bmi = (BITMAPINFO*)buffer;
FillBitmapInfo(bmi,width,height,Bpp(pDoc->m_cvImage),0);
SetDIBitsToDevice(pDC->GetSafeHdc(), 0, 0, width,
height, 0, 0, 0, height, pDoc->m_cvImage.data, bmi,
DIB_RGB_COLORS);
}
void COpenCVTestView::FillBitmapInfo(BITMAPINFO* bmi, int width, int height, int bpp, int origin)
{
assert(bmi && width >= 0 && height >= 0 && (bpp == 8 || bpp == 24 || bpp == 32));
BITMAPINFOHEADER* bmih = &(bmi->bmiHeader);
memset(bmih, 0, sizeof(*bmih));
bmih->biSize = sizeof(BITMAPINFOHEADER);
bmih->biWidth = width;
bmih->biHeight = origin ? abs(height) : -abs(height);
bmih->biPlanes = 1;
bmih->biBitCount = (unsigned short)bpp;
bmih->biCompression = BI_RGB;
if (bpp == 8)
{
RGBQUAD* palette = bmi->bmiColors;
for (int i = 0; i < 256; i++)
{
palette[i].rgbBlue = palette[i].rgbGreen = palette[i].rgbRed = (BYTE)i;
palette[i].rgbReserved = 0;
}
}
}
और क्या लिंक आपके द्वारा दी गई गलत है: निम्नलिखित कोड आप CImage को चटाई में बदल सकते हैं और उसके बाद CImage प्रदर्शित हर जगह आप चाहते हैं का उपयोग करना? – Sam
@ vasile SetDIBitsToDevice पर दस्तावेज़ों के बावजूद, मैं एक आयामी सरणी "डेटा" सदस्य रिटर्न के साथ SetDIBitsToDevice का उपयोग करने का तरीका नहीं समझ सकता। –
@ पॉल मैंने आपके उदाहरण को कई अन्य प्रश्नों/उत्तरों के आधार के रूप में देखा है। हालांकि, मैं सोच रहा हूं, 'FillBitmapInfo' फ़ंक्शन' में 'memset' के उपयोग से मेमोरी लीक से कैसे बचें? या किसी भी तरह से स्वचालित रूप से मुक्त हो जाता है? क्या आप इस संबंध में विस्तार कर सकते हैं। – adn