![depthmap thing](https://i.stack.imgur.com/mdxLq.png)
आज, मैं अपने सहयोगियों के साथ पीने चला गया, और पाँच बियर और कुछ tequillas के बाद मैं इस पाया सवाल और विचार, "हाँ में है!" तो मैं थोड़ी देर के लिए संघर्ष कर रहा था लेकिन फिर मुझे मेक्स का उपयोग करके एक सरल समाधान मिला। मैंने सिद्धांत दिया कि अंतिम विंडो द्वारा बनाए गए ओपनजीएल संदर्भ को सक्रिय छोड़ा जा सकता है और इसलिए "सी" से पहुंच योग्य हो सकता है, यदि स्क्रिप्ट एक ही थ्रेड में चलती है।
मैंने एक साधारण "सी" प्रोग्राम बनाया जो एक मैटलैब फ़ंक्शन को कॉल करता है, जिसे "टेस्टोफिमीफिल्टर" कहा जाता है, जो फ़िल्टर की आवृत्ति प्रतिक्रिया को प्लॉट करता है (जो कि मेरे पास एकमात्र स्क्रिप्ट थी)। इसे ओपनजीएल का उपयोग करके प्रस्तुत किया जाता है। फिर ओपनजीएल बफर पर जाने के लिए प्रोग्राम glGetViewport() और glReadPixels() का उपयोग करता है। फिर यह एक मैट्रिक्स बनाता है, इसे गहराई के मानों से भरता है, और इसे दूसरे फ़ंक्शन पर पास करता है, जिसे "trytodisplaydepthmap" कहा जाता है। यह imshow फ़ंक्शन का उपयोग करके गहराई से प्रदर्शित करता है। ध्यान दें कि एमईएक्स फ़ंक्शन को मूल्यों को वापस करने की अनुमति है, इसलिए हो सकता है कि पोस्टप्रोसेसिंग को कोई अन्य कार्य न हो, लेकिन मैं यह समझने में सक्षम नहीं हूं कि यह कैसे किया जाता है। हालांकि, तुच्छ होना चाहिए। मैं आज पहली बार एमएक्स के साथ काम कर रहा हूं।
अधिक देर बिना
, वहाँ स्रोत कोड हैं मैं प्रयोग किया है:
testofmyfilter.m
imp = zeros(10000,1);
imp(5000) = 1;
% impulse
[bwb,bwa] = butter(3, 0.1, 'high');
b = filter(bwb, bwa, imp);
% filter impulse by the filter
fs = 44100; % sampling frequency (all frequencies are relative to fs)
frequency_response=fft(b); % calculate response (complex numbers)
amplitude_response=20*log10(abs(frequency_response)); % calculate module of the response, convert to dB
frequency_axis=(0:length(b)-1)*fs/length(b); % generate frequency values for each response value
min_f=2;
max_f=fix(length(b)/2)+1; % min, max frequency
figure(1);
lighting gouraud
set(gcf,'Renderer','OpenGL')
semilogx(frequency_axis(min_f:max_f),amplitude_response(min_f:max_f),'r-') % plot with logarithmic axis using red line
axis([frequency_axis(min_f) frequency_axis(max_f) -90 10]) % set axis limits
xlabel('frequency [Hz]');
ylabel('amplitude [dB]'); % legend
grid on % draw grid
test.c
//You can include any C libraries that you normally use
#include "windows.h"
#include "stdio.h"
#include "math.h"
#include "mex.h" //--This one is required
extern WINAPI void glGetIntegerv(int n_enum, int *p_value);
extern WINAPI void glReadPixels(int x,
int y,
int width,
int height,
int format,
int type,
void * data);
#define GL_VIEWPORT 0x0BA2
#define GL_DEPTH_COMPONENT 0x1902
#define GL_FLOAT 0x1406
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
int viewport[4], i, x, y;
int colLen;
float *data;
double *matrix;
mxArray *arg[1];
mexCallMATLAB(0, NULL, 0, NULL, "testofmyfilter");
// call an .m file which creates OpenGL window and draws a plot inside
glGetIntegerv(GL_VIEWPORT, viewport);
printf("GL_VIEWPORT = [%d, %d, %d, %d]\n", viewport[0], viewport[1], viewport[2], viewport[3]);
// print viewport dimensions, should be [0, 0, m, n]
// where m and n are size of the GL window
data = (float*)malloc(viewport[2] * viewport[3] * sizeof(float));
glReadPixels(0, 0, viewport[2], viewport[3], GL_DEPTH_COMPONENT, GL_FLOAT, data);
// alloc data and read the depth buffer
/*for(i = 0; i < 10; ++ i)
printf("%f\n", data[i]);*/
// debug
arg[0] = mxCreateNumericMatrix(viewport[3], viewport[2], mxDOUBLE_CLASS, mxREAL);
matrix = mxGetPr(arg[0]);
colLen = mxGetM(arg[0]);
printf("0x%08x 0x%08x 0x%08x %d\n", data, arg[0], matrix, colLen); // debug
for(x = 0; x < viewport[2]; ++ x) {
for(y = 0; y < viewport[3]; ++ y)
matrix[x * colLen + y] = data[x + (viewport[3] - 1 - y) * viewport[2]];
}
// create matrix, copy data (this is stupid, but matlab switches
// rows/cols, also convert float to double - but OpenGL could have done that)
free(data);
// don't need this anymore
mexCallMATLAB(0, NULL, 1, arg, "trytodisplaydepthmap");
// pass the array to a function (returnig something from here
// is beyond my understanding of mex, but should be doable)
mxDestroyArray(arg[0]);
// cleanup
return;
}
trytodisplaydepthmap.m:
function [] = trytodisplaydepthmap(depthMap)
figure(2);
imshow(depthMap, []);
% see what's inside
वें बचाओ एक ही निर्देशिका में ese, साथ test.c संकलन (टाइप कि मैटलैब कंसोल के लिए):
mex test.c Q:\MATLAB\R2008a\sys\lcc\lib\opengl32.lib
कहाँ "क्यू: \ MATLAB \ R2008a \ sys \ एल सी सी \ lib \ opengl32.lib" पथ है करने के लिए "opengl32 .lib "फ़ाइल।
और अंततः मैटलैब कंसोल में "परीक्षण" टाइप करके इसे निष्पादित करें। इसे फ़िल्टर आवृत्ति प्रतिक्रिया के साथ एक खिड़की लाना चाहिए, और गहराई बफर के साथ एक और खिड़की। नोट करें कि "सी" कोड गहराई बफर पढ़ता है, इस समय फ्रंट और बैक बफर को स्वैप किया जाता है, इसलिए किसी भी परिणाम प्राप्त करने के लिए स्क्रिप्ट को दो बार चलाने की आवश्यकता हो सकती है (इसलिए फ्रंट बफर जिसमें अब बैक बफर के साथ परिणाम स्वैप होते हैं, और गहराई को पढ़ा जा सकता है)।यह स्वचालित रूप से "सी" द्वारा किया जा सकता है, या आप getframe (gcf) सहित कोशिश कर सकते हैं; आपकी स्क्रिप्ट के अंत में (जो ओपनजीएल से भी वापस पढ़ता है, इसलिए यह आपके लिए बफर को स्वैप करता है, या कुछ)।
यह मैटलैब 7.6.0.324 (आर 2008 ए) में मेरे लिए काम करता है। स्क्रिप्ट चलता है और निम्न को थकाता है:
>>test
GL_VIEWPORT = [0, 0, 560, 419]
0x11150020 0x0bd39620 0x12b20030 419
और निश्चित रूप से यह छवियों को प्रदर्शित करता है। ध्यान दें कि गहराई बफर रेंज Matlab पर निर्भर करती है, और काफी अधिक हो सकती है, इसलिए जेनरेट की गई छवियों का कोई भी अर्थ सरल नहीं हो सकता है।
आप हमेशा एक प्रश्न प्राप्त करने के लिए एक उपहार देने की कोशिश कर सकते हैं। – PeterT
मेरा इरादा है, लेकिन केवल तब ही पता चला जब मैंने सवाल पोस्ट किया कि मुझे दो दिनों तक इंतजार करना होगा जब तक कि यह वर्तमान प्रश्न योग्य नहीं हो जाता। – twerdster
क्या आप ऐसे उत्तरों को स्वीकार करते हैं जिनमें केवल मैटलैब शामिल है? मुझे जॉग के बारे में कोई जानकारी नहीं है। –