我想用OpenCV加载图像(jpg和png)作为OpenGL纹理.
这是我如何将图像加载到OpenGL:
glEnable(GL_TEXTURE_2D);
textureData = loadTextureData("textures/trashbin.png");
cv::Mat image = cv::imread("textures/trashbin.png");
if(image.empty()){
std::cout << "image empty" << std::endl;
}else{
glGenTextures( 1, &textureTrash );
glBindTexture( GL_TEXTURE_2D, textureTrash );
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S , GL_REPEAT );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
glTexImage2D(GL_TEXTURE_2D,0,3,image.cols, image.rows,0,GL_RGB,GL_UNSIGNED_BYTE, image.data);
}
Run Code Online (Sandbox Code Playgroud)
加载图像,因为"image.empty"始终返回false
以下是使用创建的纹理渲染场景的方法:
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textureTrash);
glm_ModelViewMatrix.top() = glm::translate(glm_ModelViewMatrix.top(),0.0f,-13.0f,-10.0f);
glUniformMatrix4fv(uniformLocations["modelview"], 1, false, glm::value_ptr(glm_ModelViewMatrix.top()));
std::cout << "textureShaderID: " << glGetUniformLocation(shaderProgram,"texture") << std::endl;
glUniform1i(glGetUniformLocation(shaderProgram,"texture"), 0);
objLoader->getMeshObj("trashbin")->render();
Run Code Online (Sandbox Code Playgroud)
最后我想将纹理应用到几何体中的fragmentShader
#version 330
in vec2 tCoord;
// texture //
// TODO: set up a …Run Code Online (Sandbox Code Playgroud) 我有三个不同的numpy数组
a = array([ 0, 3, 6, 9, 12])
b = array([ 1, 4, 7, 10, 13])
c = array([ 2, 5, 8, 11, 14])
Run Code Online (Sandbox Code Playgroud)
我如何使用numpy方法加入它们
d = array[(0,1,2,3,4,...,12,13,14)]
Run Code Online (Sandbox Code Playgroud)
我不想写一个循环
for i in range(len(a)):
[...]
Run Code Online (Sandbox Code Playgroud)
这只是我的项目中的一个例子,数组没有排序,我想保持他们的顺序.
我目前正在使用Android上的OpenGL ES 2.0开发我的第一个项目.
我正在解析一个目标文件(.obj),并希望渲染生成的网格.问题是它在我的"Galaxy Nexus"上运行得非常好,但是当我尝试在"Samsung Galaxy Note 10.1"上运行应用程序时,屏幕上没有任何内容.
因为它在Nexus上正确呈现,我认为.obj被正确解析 - 但如果不是,我认为我应该在平板电脑上看到任何东西 - 即使它不正确.
这是我用于渲染的代码.
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, triangleBuffer);
GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
//System.out.println(("MESH: " + GLES20.glGetAttribLocation(shaderProgram, "vertex") + " " + GLES20.glGetAttribLocation(shaderProgram, "vertex")));
GLES20.glVertexAttribPointer(GLES20.glGetAttribLocation(shaderProgram, "vertex"), 3, GLES20.GL_FLOAT, false, floatPerVertex*mBytesPerFloat, 0);
GLES20.glEnableVertexAttribArray(GLES20.glGetAttribLocation(shaderProgram, "vertex"));
GLES20.glVertexAttribPointer(GLES20.glGetAttribLocation(shaderProgram, "normal"), 3, GLES20.GL_FLOAT, false, floatPerVertex*mBytesPerFloat, 3*mBytesPerFloat);
GLES20.glEnableVertexAttribArray(GLES20.glGetAttribLocation(shaderProgram, "normal"));
GLES20.glDrawElements(GLES20.GL_TRIANGLE_STRIP, faceCount , GLES20.GL_UNSIGNED_INT, 0);
Run Code Online (Sandbox Code Playgroud)
Nexus设备和其他设备上的GLES 2.0之间是否存在不匹配?
编辑:LogCat中没有错误
我有一个包含名称和颜色代码的数组.我想用gridview中的颜色为数组中的颜色着色.我创建了这段代码但是我得到了NPE,这是错误:
Logcat输出:
Caused by: java.lang.NullPointerException
10-06 11:03:30.513 25902-25902/? E/AndroidRuntime:
at android.graphics.Color.parseColor(Color.java:211)
Run Code Online (Sandbox Code Playgroud)
颜色XML文件:
<array name="colors">
<item name="White">#FFFFFF</item>
<item name="Ivory">#FFFFF0</item>
<item name="LightYellow">#FFFFE0</item>
<item name="Yellow">#FFFF00</item>
<item name="Snow">#FFFAFA</item>
<item name="FloralWhite">#FFFAF0</item>
</array>
Run Code Online (Sandbox Code Playgroud)
源代码:
public class ColorPickerAdapter extends BaseAdapter {
private Context context;
private List<Integer> colorList = new ArrayList<Integer>();
public ColorPickerAdapter(Context context) {
this.context = context;
String colors[] = context.getResources().getStringArray(R.array.colors);
colorList = new ArrayList<Integer>();
// add the color array to the list
for (int i = 0; i < colors.length; i++) {
colorList.add(Color.parseColor(colors[i]));
}
[..]
Run Code Online (Sandbox Code Playgroud) 在我目前的开发过程中,我遇到了一个非常奇怪的错误...在所有经过测试的API版本上,应用程序运行完美,流畅且没有错误,但仅在API 21上我收到以下错误,我不知道如何解决这个问题.
06-08 12:59:49.703 2865-2865/de.eplus.b2p.alditalk.mock_local E/AndroidRuntime: FATAL EXCEPTION: main
Process: mypackage, PID: 2865
java.lang.RuntimeException: Unable to start activity ComponentInfo{de.eplus.b2p.alditalk.mock_local/mypackage.LoginActivity}: android.view.InflateException: Binary XML file line #72: Error inflating class EditText
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2739)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2804)
at android.app.ActivityThread.access$900(ActivityThread.java:181)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1473)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:6066)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
Caused by: android.view.InflateException: Binary XML file line #72: Error inflating class EditText
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:770)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:813)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:821)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:821)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:821)
at android.view.LayoutInflater.inflate(LayoutInflater.java:511)
at android.view.LayoutInflater.inflate(LayoutInflater.java:415)
at android.view.LayoutInflater.inflate(LayoutInflater.java:366) …Run Code Online (Sandbox Code Playgroud) 我想在我的程序中渲染n纹理并存储它们以供以后使用.因此我使用OpenGL FramebufferObject.
首先,我创建一个包含128个纹理的数组
self.textures = glGenTexture(128)
Run Code Online (Sandbox Code Playgroud)
第二步是一个包含128次迭代的循环,其中我将位置i处的纹理绑定并渲染到其中.
glBindTexture(GL_TEXTURE_2D, self.texture[i])
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_NEAREST)
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_NEAREST)
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, None);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, self.texture[i], 0);
renderScene()
Run Code Online (Sandbox Code Playgroud)
最后一步是另一个循环,MainGameLoop,我在其中使用纹理数组中的一个纹理渲染一个平面.
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
gluLookAt(0,0,1,0,0,0,0,1,0)
glEnable(GL_TEXTURE_2D)
glBindTexture(GL_TEXTURE_2D, self.texture[i])
glBegin(GL_QUADS)
glNormal3f(0.0, 1.0, 0.0)
glTexCoord2f(0.0, 0.0)
glVertex3f(-1, 1, -1)
glTexCoord2f(1.0, 0.0)
glVertex3f(1, 1, -1)
glTexCoord2f(1.0, 1.0)
glVertex3f(1, -1, -1)
glTexCoord2f(0.0, 1.0)
glVertex3f(-1, -1, -1)
glEnd();
glDisable(GL_TEXTURE_2D)
Run Code Online (Sandbox Code Playgroud)
但出了点问题,屏幕保持黑色.
我正在尝试使用法线贴图渲染场景
因此,我正在计算C++中的切线空间,并将binormal和tanget分别存储在一个数组中,该数组将使用vertexattribpointer上传到我的着色器.
这是我如何计算空间
void ObjLoader::computeTangentSpace(MeshData &meshData) {
GLfloat* tangents = new GLfloat[meshData.vertex_position.size()]();
GLfloat* binormals = new GLfloat[meshData.vertex_position.size()]();
std::vector<glm::vec3 > tangent;
std::vector<glm::vec3 > binormal;
for(unsigned int i = 0; i < meshData.indices.size(); i = i+3){
glm::vec3 vertex0 = glm::vec3(meshData.vertex_position.at(meshData.indices.at(i)), meshData.vertex_position.at(meshData.indices.at(i)+1),meshData.vertex_position.at(meshData.indices.at(i)+2));
glm::vec3 vertex1 = glm::vec3(meshData.vertex_position.at(meshData.indices.at(i+1)), meshData.vertex_position.at(meshData.indices.at(i+1)+1),meshData.vertex_position.at(meshData.indices.at(i+1)+2));
glm::vec3 vertex2 = glm::vec3(meshData.vertex_position.at(meshData.indices.at(i+2)), meshData.vertex_position.at(meshData.indices.at(i+2)+1),meshData.vertex_position.at(meshData.indices.at(i+2)+2));
glm::vec3 normal = glm::cross((vertex1 - vertex0),(vertex2 - vertex0));
glm::vec3 deltaPos;
if(vertex0 == vertex1)
deltaPos = vertex2 - vertex0;
else
deltaPos = vertex1 - vertex0;
glm::vec2 uv0 = glm::vec2(meshData.vertex_texcoord.at(meshData.indices.at(i)), meshData.vertex_texcoord.at(meshData.indices.at(i)+1));
glm::vec2 uv1 …Run Code Online (Sandbox Code Playgroud) 我想使用 OpenCV 进行一些运动结构。到目前为止,我已经有了基本矩阵和基本矩阵。有了基本矩阵,我正在做 SVD 来获得 R 和 T。
我的问题是,我有 2 个可能的 R 解决方案和 2 个可能的 T 解决方案,这导致整体姿势有 4 个解决方案,其中 4 个解决方案中只有一个是正确的。我怎样才能找到正确的解决方案?
这是我的代码:
private void calculateRT(Mat E, Mat R, Mat T){
Mat w = new Mat();
Mat u = new Mat();
Mat vt = new Mat();
Mat diag = new Mat(3,3,CvType.CV_64FC1);
double[] diagVal = {1,0,0,0,1,0,0,0,1};
diag.put(0, 0, diagVal);
Mat newE = new Mat(3,3,CvType.CV_64FC1);
Core.SVDecomp(E, w, u, vt, Core.DECOMP_SVD);
Core.gemm(u, diag, 1, vt, 1, newE);
Core.SVDecomp(newE, w, u, vt, Core.DECOMP_SVD);
publishProgress("U: " …Run Code Online (Sandbox Code Playgroud) 我正在使用运动结构进行一些多视图几何重建.到目前为止,我有以下情况
两个图像作为初始输入相机参数和失真系数初始输入图像的工作整流管道创建视差图从视差图创建一个pointCloud,迭代视差图并将值取为z(x和y是像素视差图中像素的坐标)(什么不工作是reprojectImageTo3D,因为我的Q矩阵似乎非常错误,但其他一切都工作得很好)这给了我一个很好的场景点云.
现在我需要在管道中添加更多图像.我google了很多,发现方法solvePnP会帮助我.
但现在我很困惑......
SolvePnP将获取3D点和相应的2D图像点的列表,并重建第三,第四相机的R和T矢量......等等.我已经读过,这些矢量需要对齐,这意味着第一个矢量中的第一个3D点对应于第二个矢量中的第一个2D点.
到现在为止还挺好.但是从哪里可以看出那些对应?我可以使用此方法reprojectPoints获取这两个向量??? 或者使用视差图进行深度重建,我的整个想法是错误的?(替代方案:使用之前找到的良好匹配的triangulatePoints).
有人可以帮我解决这个问题吗?如何使用solvePnP添加更多摄像头,从而将3D点添加到我的pointcloud并改善重建结果?
我想在给定点周围的圆上移动一个对象.我在Android上使用OpenGL,而我的视口是横向模式下的屏幕分辨率(1280*800).我想要旋转对象的点是例如(500,300),这是用户按下的位置.我也有所需圆圈的半径r.总结一下,我是圆的中心,半径和角度(我希望在游戏循环的每次迭代中移动对象的数量)
到目前为止我试过这个:
this.setPosX(((float)Math.cos(angle)*radius + center.x) * width);
this.setPosY(((float)Math.sin(angle)*radius + center.y) * height);
Run Code Online (Sandbox Code Playgroud)
这将创建沿省略号的运动,而不是圆圈......
谁能帮帮我吗?
我的图像是类型CV_8UC3(它是灰度图像),我需要它CV_8UC1.我怎样才能进行转型?我已经试过了
Mat right = new Mat(rectRight.width(), rectRight.height(), CvType.CV_8UC1);
rectRight.convertTo(right, CvType.CV_8UC1,255,0);
Run Code Online (Sandbox Code Playgroud)
但它仍然给我一个3通道图像.
RectLeft是此图像的修正版本:
Imgproc.undistort(Highgui.imread(images[0], Imgproc.COLOR_BGR2GRAY), undist_left, cameraMatrix, distCoeff);
Run Code Online (Sandbox Code Playgroud)
使用这部分代码完成整改:
Mat rectLeft = new Mat();
Imgproc.initUndistortRectifyMap(cameraMatrix, distCoeff, R1, newCameraMatrix_left, left.size(), CvType. CV_32FC1, map1_left, map2_left);
Imgproc.remap(left, rectLeft, map1_left, map2_left, Imgproc.INTER_LANCZOS4);
Run Code Online (Sandbox Code Playgroud)
应使用经过校正的图像(及其右侧相机的伙伴)
StereoBM stereoAlgo = new StereoBM();
stereoAlgo.compute(left, right, disparity);
Run Code Online (Sandbox Code Playgroud)
但是有一个例外,它说两个输入图像都应该是类型,CV_8UC1但我已经检查并rectLeft.type()给了我一个16.(我猜这是CV_8UC1).
我在没有NDK的情况下在Android上使用OpenCV遇到了一些问题.
目前我正在做一个我的大学的项目,我的厨师告诉我,当从2D图像重建3D对象时,我应该避免相机校准.
到目前为止,我有2个2D图像,并具有所有特征点,匹配,good_matches,基本矩阵和同质矩阵.另外,我使用StereoBM计算了视差图.下一步应该是从所有这些值中获取3D点云.
我检查了互联网并找到了
Calib3d.reprojectImageTo3D(disparity, _3dImage, Q, false);
Run Code Online (Sandbox Code Playgroud)
使用这种方法,我应该能够重新创建3D点云......目前的问题是,我没有Matrix Q.我想我会从方法中得到这个
stereoRectify(...);
Run Code Online (Sandbox Code Playgroud)
但是因为我应该避免cameraCalibration用于这种特定情况,所以我不能使用这种方法.替代方案
stereoRectifyUncalibrated(...);
Run Code Online (Sandbox Code Playgroud)
不提供Q ...
有人可以帮助我,告诉我如何以更简单的方式获得Q或点云吗?谢谢
我正在努力在 Java 中格式化数字。
我的输入格式如下(我无法更改):2.000,15 ,输出应如下所示:2000.15
如果逗号后只有 0,则输出应如下所示:2000
输入以字符串形式给出。
我已经尝试使用 aDecimalFormat但这只会导致IllegalArgumentException
DecimalFormat decimalFormat = (DecimalFormat) NumberFormat.getInstance(Locale.ENGLISH);
decimalFormat.setMinimumFractionDigits(0);
decimalFormat.setMaximumFractionDigits(2);
decimalFormat.setGroupingUsed(false);
return decimalFormat.format(Double.parseDouble(characteristicValue));
Run Code Online (Sandbox Code Playgroud)