从camera preview获取数据流问题求教!

本人android开发新人,以下是我为了从预览数据流抓取图片并存储而编写的代码。网上说“从camera读取到的预览(preview)图像流一定要输出到一个可见的(Visible)SurfaceView上,然后通过Camera.PreviewCallback的public void onPreviewFrame(byte[] data, Camera camera)函数来获得图像帧数据的拷贝。”那么显示在SurfaceView上的数据流还是完整的吧,不会出现预览停顿的现象吧?为什么我的程序运行之后,预览一闪而过,然后程序重启,如此反复三遍,报出进程意外停止呢?而且也没有保存到图像。这个程序会以什么频率保存图片啊?onPreviewFrame(byte[] data, Camera camera)是每一帧都保存吗?如何控制保存频率?
求大神细心讲解,在线求教!或者QQ:851391489,隐身状态。拜谢!

package com.android.silentcamera;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;

import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.hardware.Camera;
import android.hardware.Camera.CameraInfo;
import android.hardware.Camera.PreviewCallback;
import android.media.AudioManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.provider.MediaStore.Images.Media;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class SilentCameraActivity extends Activity
implements Camera.PreviewCallback, SurfaceHolder.Callback
{

SurfaceView mSurfaceView;
SurfaceHolder mSurfaceHolder;
Camera mCamera;

public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    mSurfaceView = (SurfaceView) this.findViewById(R.id.surfaceview); 
    mSurfaceHolder = mSurfaceView.getHolder(); 
    mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    mSurfaceHolder.addCallback(this);
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    // TODO Auto-generated method stub
    mCamera.stopPreview();
    mCamera.release();
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    // TODO Auto-generated method stub
    //打开前置摄像头 
    mCamera = Camera.open(CameraInfo.CAMERA_FACING_FRONT);

    //开始预览
    try 
    {
        //设置哪个surfaceView显示图片
        mCamera.setPreviewDisplay(mSurfaceHolder);
    }
    catch (IOException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    //设置预览帧的接口,就是通过这个接口,我们来获得预览帧的数据的
    mCamera.setPreviewCallback(SilentCameraActivity.this); 
    mCamera.startPreview();
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {
    // TODO Auto-generated method stub
    mCamera.startPreview();
}

    //拍照+退出 
    public void onPreviewFrame(byte[] data, Camera camera) 
    { 
        int w = camera.getParameters().getPreviewSize().width; 
        int h = camera.getParameters().getPreviewSize().height; 
        save(w,h,data); 
        finish(); 
    } 

    static public void decodeYUV420SP(int[] rgb, byte[] yuv420sp, int width, int height) {
        final int frameSize = width * height;

        for (int j = 0, yp = 0; j < height; j++) {
        int uvp = frameSize + (j >> 1) * width, u = 0, v = 0;
        for (int i = 0; i < width; i++, yp++) {
            int y = (0xff & ((int) yuv420sp[yp])) - 16;
            if (y < 0) y = 0;
            if ((i & 1) == 0) {
                v = (0xff & yuv420sp[uvp++]) - 128;
                u = (0xff & yuv420sp[uvp++]) - 128;
            }

            int y1192 = 1192 * y;
            int r = (y1192 + 1634 * v);
            int g = (y1192 - 833 * v - 400 * u);
            int b = (y1192 + 2066 * u);

            if (r < 0) r = 0; else if (r > 262143) r = 262143;
            if (g < 0) g = 0; else if (g > 262143) g = 262143;
            if (b < 0) b = 0; else if (b > 262143) b = 262143;

            rgb[yp] = 0xff000000 | ((r << 6) & 0xff0000) | ((g >> 2) & 0xff00) | ((b >> 10) & 0xff);
        }
    }
}

    //保存 
    public void save(int w,int h,byte[] data){ 
        //预览编码为YUV420SP的视频流,需转换为RGB编码 
        int[] RGBData = new int[w* h]; 
        byte[] mYUVData = new byte[data.length]; 

        System.arraycopy(data,0, mYUVData, 0,data.length); 
        decodeYUV420SP(RGBData,mYUVData,w,h);

        //图片保存到sdcard 
        final Bitmap bitmap = Bitmap.createBitmap(w,h, Bitmap.Config.ARGB_8888); 
        try 
        { 
            FileOutputStream outputStream = new FileOutputStream(Environment.getExternalStorageDirectory().getPath() + UUID.randomUUID() + ".png"); 
            bitmap.compress(CompressFormat.PNG, 50, outputStream); 
            outputStream.close(); 
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }

}

2个回答

我觉得大概是因为
FileOutputStream outputStream = new FileOutputStream(Environment.getExternalStorageDirectory().getPath() + UUID.randomUUID() + ".png");
这里是不是少了个“/”
Environment.getExternalStorageDirectory().getPath() +“/”+ UUID.randomUUID() + ".png"
文件目录是这个

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
camera preview闪烁问题。
camera preview闪烁问题。 创建了SurfaceView后进行 startPreview,发现闪的跟旧式电视的那种条纹状似的。 我的手机时三星galaxy note 3, 自带的相机现实很正常。 有没有人知道这个问题怎么解决?
如何在service中获取camera中的视频数据
小弟是Android新手,最近遇到一点困难,困难具体如下,请各位大哥赐教: 我想在service中获取camera组件,然后把从camera中获取的数据通过 socket发送到电脑端。 现在主要的问题是不知道怎么获取camera中的数据,surfaceView貌似行不通
在手机的Camera已经打开情况下,如何使用adb shell命令切换Camera前后摄像头?
在Android系统中,当Camera已经打开了, 但是想通过adb命令来控制选择前后摄像头,请问有什么办法,命令是多少? 当前知道的adb操作手机命令: 点亮/关闭屏幕 adb shell input keyevent 26 设置手机休眠时间 adb shell settings gett system screen_off_timeout(查看手机休眠时间) adb shell settings put system screen_off_timeout 600000(10分钟) adb shell settings put system screen_off_timeout 2147483647(常亮) 打开camera adb shell am start -a android.media.action.STILL_IMAGE_CAMERA
Android开发中如何用OpenCV调用Camera2返回的数据进行处理?
最近正学习开发一个小项目,需要用到OpenCV对摄像头采集到的图像进行处理。**因为处理过程中要求对曝光时间和增益进行精准控制**,所以只能使用Camera2进行摄像头控制。 网上这部分资料比较少,**请问如何调取图像数据进行处理?** ``` private void createCameraPreviewSession() { try { SurfaceTexture texture = mTextureView.getSurfaceTexture(); assert texture != null; // We configure the size of default buffer to be the size of camera preview we want. texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight()); // This is the output Surface we need to start preview. Surface surface = new Surface(texture); // We set up a CaptureRequest.Builder with the output Surface. mPreviewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); mPreviewRequestBuilder.addTarget(surface); // Here, we create a CameraCaptureSession for camera preview. mCameraDevice.createCaptureSession(Arrays.asList(surface, mImageReader.getSurface()), new CameraCaptureSession.StateCallback() { @Override public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) { // The camera is already closed if (null == mCameraDevice) { return; } // When the session is ready, we start displaying the preview. mCaptureSession = cameraCaptureSession; try { // Auto focus should be continuous for camera preview. mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE); // Flash is automatically enabled when necessary. setAutoFlash(mPreviewRequestBuilder); // Finally, we start displaying the camera preview. mPreviewRequest = mPreviewRequestBuilder.build(); mCaptureSession.setRepeatingRequest(mPreviewRequest, mCaptureCallback, mBackgroundHandler); } catch (CameraAccessException e) { e.printStackTrace(); } } @Override public void onConfigureFailed( @NonNull CameraCaptureSession cameraCaptureSession) { showToast("Failed"); } }, null ); } catch (CameraAccessException e) { e.printStackTrace(); } } ``` 有一部分资料说是从SurfaceTexture中获取,不知可否能行?希望能提供详细链接或者Demo,感激不尽!!!
HeavenHelix 代码的编写
Problem Description It's said that MJ was invited to perform for the God. Unfortunately, God was intoxicated in the excellent voice and the moonwalk of MJ. The second day, God said, "Let there be MJ and there was MJ." So MJ stayed, leaving his poor fans' hearts broken ... (Sounds unrealistic.) However, when the third day passed, MJ missed his Neverland so much. His soulful songs conveyed the sorrow to the God. So God built a new Neverland in the Heaven on the forth day. It is said that there is a Roller Coaster called HeavenHelix in the new Neverland. It is so huge that the train seemed to be just a point. The train does uniform circular motion on horizontal plane(The radius is r,and the angular speed is ω rad/s),while it does uniform liner motion in vertical direction(The speed is v m/s)from the top to the bottom. To monitor the train, there is a camera installed on the bottom, where the center of the circle is located. The amount of energy the camera consumes is up to the distance between the train and itself: Assuming the distance is D meters, and in the very moment it travels ds meters, the camera should consume X*D*ds kJ energy from the God. When the Neverland was built, God distributed E kJ energy to the camera initially. God had calculated accurately to make sure that the train will be exactly on the bottom, as soon as the energy is used up. MJ wanted to know how long he can enjoy himself riding the HeavenHelix the sky. Can you help him? Input There are multiple cases. In each case, there will be only one line, containing five integers, r,ω, v, X and E (r≥0, ω≥0, v > 0, X > 0, E≥0), which have the same meaning mentioned above. All the numbers are smaller than 231. The input will be terminated by five zero, which were not need to be proceeded. There is a correct answer for each case. Output For each case, output the total time of the train ran before its stop in a single line. Present the answer in seconds, and accurate to 4 decimal places. You may assume that MJ can ride the HeavenHelix for at most 30 days. Sample Input 1 1 2 2 2 0 0 0 0 0 Sample Output 0.4062
Android中使用Camera2开发聚焦,前后摄像头切换的拍照功能
使用Camera2开发照相机功能,可以进行重复拍照,刚开始拍照是好的,但是重复拍照的时候就会报错如下,有时候第一次拍照就报错,有时候拍了几十张后报错,报错就是闪退 E/AndroidRuntime: FATAL EXCEPTION: LegacyCameraCallback     Process: com.ajmd.hais.mobile, PID: 24711     java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Surface android.hardware.camera2.params.OutputConfiguration.getSurface()' on a null object reference         at android.hardware.camera2.impl.CameraDeviceImpl$CameraDeviceCallbacks.onCaptureErrorLocked(CameraDeviceImpl.java:1925)         at android.hardware.camera2.impl.CameraDeviceImpl$CameraDeviceCallbacks.onDeviceError(CameraDeviceImpl.java:1693)         at android.hardware.camera2.legacy.CameraDeviceUserShim$CameraCallbackThread$CallbackHandler.handleMessage(CameraDeviceUserShim.java:299)         at android.os.Handler.dispatchMessage(Handler.java:102)         at android.os.Looper.loop(Looper.java:154)         at android.os.HandlerThread.run(HandlerThread.java:61)
Camera2 如何同时开启前后摄像头Preview并进行录像?
我按照camera2 谷歌的demo,同时开启两个线程进行相同操作,但是运行时最后一个摄像头能preview出来,前一个停在最后一帧,不能两个同时动。请问如何进行多线程同时操作?本人新手,多线程不太熟悉,求指教! @Override public void onResume() { super.onResume(); if (texture_front.isAvailable()) { openCamera(false,texture_front.getWidth(), texture_front.getHeight()); } else { texture_front.setSurfaceTextureListener(mFrontTextureListener); } if (texture_back.isAvailable()) { openCamera(true,texture_back.getWidth(), texture_back.getHeight()); } else { texture_back.setSurfaceTextureListener(mBackTextureListener); } startBackgroundThread(); } private void startBackgroundThread() { mBackgroundThread_front = new HandlerThread("Camera_front"); mBackgroundThread_front.start(); mHandler_front = new Handler(mBackgroundThread_front.getLooper()); mBackgroundThread_back=new HandlerThread("Camera_back"); mBackgroundThread_back.start(); mHandler_back=new Handler(mBackgroundThread_back.getLooper()); } 接下来OpenCamera方法 private void openCamera(boolean isBack,int width, int height) { if (!hasPermissionsGranted(VIDEO_PERMISSIONS)) { requestVideoPermissions(); return; } final Activity activity = getActivity(); if (null == activity || activity.isFinishing()) { return; } CameraManager manager = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE); try { L.d("tryAcquire"); if (!getSemaphore(isBack).tryAcquire(2500, TimeUnit.MILLISECONDS)) { throw new RuntimeException("Time out waiting to lock camera opening."); } String cameraId; if (isBack){ cameraId = manager.getCameraIdList()[0]; //0后 1前 // Choose the sizes for camera preview and video recording CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId); StreamConfigurationMap map = characteristics .get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); mSensorOrientation = characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION); if (map == null) { throw new RuntimeException("Cannot get available preview/video sizes"); } mVideoSize = chooseVideoSize(map.getOutputSizes(MediaRecorder.class)); mPreviewSize = chooseOptimalSize(map.getOutputSizes(SurfaceTexture.class), width, height, mVideoSize); int orientation = getResources().getConfiguration().orientation; if (orientation == Configuration.ORIENTATION_LANDSCAPE) { texture_back.setAspectRatio(mPreviewSize.getWidth(), mPreviewSize.getHeight()); } else { texture_back.setAspectRatio(mPreviewSize.getHeight(), mPreviewSize.getWidth()); } configureTransform(true,width, height); mMediaRecorder = new MediaRecorder(); manager.openCamera(cameraId, mStateCallback_back, null); }else { cameraId = manager.getCameraIdList()[1]; //0后 1前 // Choose the sizes for camera preview and video recording CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId); StreamConfigurationMap map = characteristics .get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); mSensorOrientation = characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION); if (map == null) { throw new RuntimeException("Cannot get available preview/video sizes"); } mVideoSize = chooseVideoSize(map.getOutputSizes(MediaRecorder.class)); mPreviewSize = chooseOptimalSize(map.getOutputSizes(SurfaceTexture.class), width, height, mVideoSize); int orientation = getResources().getConfiguration().orientation; if (orientation == Configuration.ORIENTATION_LANDSCAPE) { texture_front.setAspectRatio(mPreviewSize.getWidth(), mPreviewSize.getHeight()); } else { texture_front.setAspectRatio(mPreviewSize.getHeight(), mPreviewSize.getWidth()); } configureTransform(false,width, height); mMediaRecorder = new MediaRecorder(); manager.openCamera(cameraId, mStateCallback_front, null); } } catch (CameraAccessException e) { showTip("Cannot access the camera."); activity.finish(); } catch (NullPointerException e) { // Currently an NPE is thrown when the Camera2API is used but not supported on the // device this code runs. ErrorDialog.newInstance(getString(R.string.camera_error)) .show(getChildFragmentManager(), FRAGMENT_DIALOG); } catch (InterruptedException e) { throw new RuntimeException("Interrupted while trying to lock camera opening."); } } #然后到StateCallBack,我分成前后摄像头两个callback private CameraDevice.StateCallback mStateCallback_back = new CameraDevice.StateCallback() { @Override public void onOpened(@NonNull CameraDevice cameraDevice) { mCameraDevice = cameraDevice; startPreview(true); mCameraOpenCloseLock.release(); if (null != texture_back) { configureTransform(true,texture_back.getWidth(), texture_back.getHeight()); } } @Override public void onDisconnected(@NonNull CameraDevice cameraDevice) { mCameraOpenCloseLock.release(); cameraDevice.close(); mCameraDevice = null; } @Override public void onError(@NonNull CameraDevice cameraDevice, int error) { mCameraOpenCloseLock.release(); cameraDevice.close(); mCameraDevice = null; Activity activity = getActivity(); if (null != activity) { activity.finish(); } } }; private CameraDevice.StateCallback mStateCallback_front = new CameraDevice.StateCallback() { @Override public void onOpened(@NonNull CameraDevice cameraDevice) { mCameraDevice = cameraDevice; startPreview(false); mCameraOpenCloseLock_front.release(); if (null != texture_front) { configureTransform(false,texture_front.getWidth(), texture_front.getHeight()); } } @Override public void onDisconnected(@NonNull CameraDevice cameraDevice) { mCameraOpenCloseLock_front.release(); cameraDevice.close(); mCameraDevice = null; } @Override public void onError(@NonNull CameraDevice cameraDevice, int error) { mCameraOpenCloseLock_front.release(); cameraDevice.close(); mCameraDevice = null; Activity activity = getActivity(); if (null != activity) { activity.finish(); } } }; # Callback成功后会返回startPreview()方法 private void startPreview(final Boolean isBack) { if (null == mCameraDevice || !getTexture(isBack).isAvailable() || null == mPreviewSize) { return; } final String threadName; if (isBack){ threadName="Camera_back"; }else { threadName="Camera_front"; } try { closePreviewSession(); SurfaceTexture texture = getTexture(isBack).getSurfaceTexture(); assert texture != null; texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight()); mPreviewBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); Surface previewSurface = new Surface(texture); mPreviewBuilder.addTarget(previewSurface); mCameraDevice.createCaptureSession(Collections.singletonList(previewSurface), new CameraCaptureSession.StateCallback() { @Override public void onConfigured(@NonNull CameraCaptureSession session) { mPreviewSession = session; //updatePreview if (null == mCameraDevice) { return; } try { setUpCaptureRequestBuilder(mPreviewBuilder); HandlerThread thread = new HandlerThread(threadName); thread.start(); mPreviewSession.setRepeatingRequest(mPreviewBuilder.build(), null, mHandler_back); } catch (CameraAccessException e) { e.printStackTrace(); } } @Override public void onConfigureFailed(@NonNull CameraCaptureSession session) { Activity activity = getActivity(); if (null != activity) { Toast.makeText(activity, "Failed", Toast.LENGTH_SHORT).show(); } } }, mHandler_back); } catch (CameraAccessException e) { e.printStackTrace(); } } private AutoFitTextureView getTexture(boolean isBack){ if (isBack){ return texture_back; }else { return texture_front; } } ## 以上是预览的核心代码,录像部分就不贴上去了。试了很多方法,始终不能两个摄像头同时previeew,只能其中一个单独预览。求教 ![图片说明](https://img-ask.csdn.net/upload/201903/05/1551770621_259074.jpg)
H5封壳APP后只能打开图库,不能打开摄像头
用H5 写调用摄像头 ``` <input type="file" class="input_camera" accept="image/*" capture="camera"> ``` 在手机所有浏览器能正常打开摄像头,打包成APP就无法打开摄像头,只能打开图库,有没有大佬处理过这个问题!!! !!!Mayday Mayday!!!
有两个相机,unity自带的GUI是给主相机的,我想让另一个相机也看到这些GUI,应该怎么办?
Unity项目里有一个主相机,main camera。有些GUI默认是main camera可见的。 我在场景里又添加了一个extra camera,试图让这个相机可以看到main camera看到的所有东西。 但是问题来了,GUI只能被main camera看到,extra camera如何才能看到这些GUI? 各位老爷,我也想悬赏,但是我没有c币。。。。。。哭泣。。。
android camera2 获取相机当前值的问题
我想给主页面的seekBar动态赋值,要达到的效果是: 当我在自动调焦的情况下,晃动手机,由于焦距变换,seekbar的值会一直变。 怎样可以取到相机的当前值呢?那位大神可以帮我解决下?
python列表索引超出范围如何处理?
# 大佬们这个显示“list index out of range”(中文:列表索引超出范围) #怎么解决? ``` import cv2 recognizer = cv2.face.LBPHFaceRecognizer_create() recognizer.read("C:\work\AI\AI-picture\Face recognition\\face_trainer\\trainer.yml") cascadePath = "C:\work\AI\AI-picture\Face recognition\haarcascade_frontalface_default.xml" faceCascade = cv2.CascadeClassifier(cascadePath) font = cv2.FONT_HERSHEY_SIMPLEX idnum = 0 names = ['A', 'Bob'] cam = cv2.VideoCapture(0, cv2.CAP_DSHOW) minW = 0.1*cam.get(3) minH = 0.1*cam.get(4) while True: ret, img = cam.read() gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = faceCascade.detectMultiScale( gray, scaleFactor=1.2, minNeighbors=5, minSize=(int(minW), int(minH)) ) for (x, y, w, h) in faces: cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2) idnum, confidence = recognizer.predict(gray[y:y+h, x:x+w]) if confidence < 100: idnum = names[idnum]#问题出在这儿 confidence = "{0}%".format(round(100 - confidence)) else: idnum = "unknown" confidence = "{0}%".format(round(100 - confidence)) cv2.putText(img, str(idnum), (x+5, y-5), font, 1, (0, 0, 255), 1) cv2.putText(img, str(confidence), (x+5, y+h-5), font, 1, (0, 0, 0), 1) cv2.imshow('camera', img) k = cv2.waitKey(10) if k == 27: break cam.release() cv2.destroyAllWindows() ```
opencv在摄像头已开启的情况下修改摄像头分辨率为什么还要在打开一次
if(!m_camera.isopen()) { m_camera->open(id); } m_camera->open(id); //为什么在摄像头已经打开的时候还一定要加这一句才能成功she'zhi if (!m_camera->set(CV_CAP_PROP_FRAME_WIDTH, w)) //设置帧宽 { emit sig_str("set error"); return; } if (!m_camera->set(CV_CAP_PROP_FRAME_HEIGHT, h)) //设置帧高 { emit sig_str("set error"); return; } if (!m_camera->set(CV_CAP_PROP_FORMAT, format)) //设置摄像头格式 { emit sig_str("set error"); return; } double frameRate = m_camera->get(CV_CAP_PROP_FPS); //获取帧率 emit sig_Frame(frameRate); //showVideo();
Android camera录制视频没有preview为什么不能成功?API21
http://developer.android.com/guide/topics/media/camera.html Note: It is possible to use MediaRecorder without creating a camera preview first and skip the first few steps of this process. However, since users typically prefer to see a preview before starting a recording, that process is not discussed here. Android的文档如上,我想不创建一个照相机的预览界面,按理来说是可行的。我参考文档里的步骤,省去startpreview.核心代码如下 ``` public void init(){ CameraManager manager = (CameraManager)getSystemService(Context.CAMERA_SERVICE); Log.e(TAG, "OpenCamera-Video E"); String cameraId = null; try { if(!mCameraOpenCloseLock.tryAcquire(2500, TimeUnit.MILLISECONDS)){ throw new RuntimeException("Time out waiting to lock Camera opening"); } cameraId = manager.getCameraIdList()[0]; CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId); StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); mVideoSize = chooseVideoSize(map.getOutputSizes(MediaRecorder.class)); mMediaRecorder = new MediaRecorder(); manager.openCamera(cameraId,mStateCallback,null); setUpMediaRecorder(); } catch (CameraAccessException e) { e.printStackTrace(); Log.e(TAG,"cannot access the camera"); } catch (InterruptedException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } Log.e(TAG,"openCamera-video X"); } private void setUpMediaRecorder() throws IOException { mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mMediaRecorder.setVideoEncodingBitRate(10000000); mMediaRecorder.setVideoFrameRate(30); mMediaRecorder.setVideoSize(mVideoSize.getWidth(), mVideoSize.getHeight()); mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); mMediaRecorder.setOutputFile(String.valueOf(getVideoFile())); //mMediaRecorder.setOrientationHint(orientation); mMediaRecorder.prepare(); } private CameraDevice.StateCallback mStateCallback = new CameraDevice.StateCallback() { @Override public void onOpened(CameraDevice cameraDevice) { mCameraDevice = cameraDevice; mCameraOpenCloseLock.release(); } @Override public void onDisconnected(CameraDevice cameraDevice) { mCameraOpenCloseLock.release(); cameraDevice.close(); mCameraDevice = null; } @Override public void onError(CameraDevice cameraDevice, int i) { mCameraOpenCloseLock.release(); cameraDevice.close(); mCameraDevice = null; } }; private void startRecordingVideo() { try { // UI // mButtonVideo.setText(R.string.stop); mIsRecordingVideo = true; Log.i("VideoService","在startRecordingVideo里"); // Start recording mMediaRecorder.start(); } catch (IllegalStateException e) { e.printStackTrace(); } } private boolean mIsRecordingVideo = false; private void stopRecordingVideo() { // UI mIsRecordingVideo = false; // mButtonVideo.setText(R.string.record); // Stop recording mMediaRecorder.stop(); mMediaRecorder.reset(); mMediaRecorder.release(); // Activity activity = getActivity(); Toast.makeText(this, "Video saved: " + getVideoFile(), Toast.LENGTH_SHORT).show(); // startPreview(); } ``` 在初始化的时候执行init()函数,之后,点击button按钮,对mIsRecordingVideo值判断,若为false,进入startRecordingVideo(),启动录像;若为true,进入stopRecordingVideo(),停止录像。 请问,是不是我的过程错误呢?急需!
Android camera 数据处理
Android手机自带的camera,获取视频画面,如何不转换到RGB图像,直接在YUV格式上进行处理?想得到每帧中心点的像素值。转化的话,拖慢了帧率,
求问 unity制作fps游戏的一个小问题!!!!!!!!!!!!!!!!!
如果想用unity制作一个fps游戏 用官方给的那个fpsController第一人称视角制作。 子弹发射的方法用射线检测 用ui层的中心点做准星 然后从摄像机发射一条射线 ray = Camera.main.ScreenPointToRay(new Vector3(Screen.width / 2, Screen.height / 2, 0)); 子弹以射线方向发射实现准星指哪打哪,但是问题是这样子弹就必须从摄像机的位置打出,会很假,如果想要从fpsController下面绑定的枪的模型上打出就无法保证子弹 会打在准星的位置上。 求告知 如何解决这个问题!!!!让子弹看上去是从枪口发射,又会打在ui层准星所在的位置
小白求助!!!关于利用Zbar进行二维码扫描程序的问题
构建openCV3.4.0+zbar 64位+VS2015的环境 (zbar貌似只支持32位系统因此我又自己找了64位的库) 这个程序就是利用调用摄像头扫描二维码,然后通过数学计算测量摄像头与二维码的实时距离 是按照原博主的这篇文章https://zhou-yuxin.github.io/articles/2017/%E5%9F%BA%E4%BA%8E%E4%BA%8C%E7%BB%B4%E7%A0%81%E7%9A%84%E5%AE%A4%E5%86%85%E5%AE%9A%E4%BD%8D%E6%8A%80%E6%9C%AF%EF%BC%88%E4%BA%8C%EF%BC%89%E2%80%94%E2%80%94%E5%AE%9E%E7%8E%B0/index.html参考的 又请了师兄将其中openCV老版本的语句换成了我这个版本的 本来应该按照原博的示例是这样的 ![图片说明](https://img-ask.csdn.net/upload/201912/11/1576057370_636530.jpg) 但是我运行过后变成了这样 ![图片说明](https://img-ask.csdn.net/upload/201912/11/1576057402_728485.png) 打印出来的三个变量不对 而且都是乱码 我上网搜索也没有发现相关资料和问题 真的很着急 求各位大神指教 是不是我的ZBAR安装的有问题? 真的快急哭了 求救!!! 代码如下 QRLocation.h #ifndef QRLOCATION_H #define QRLOCATION_H /* 二维码的内容必须符合格式: QRLocation,<qrSize> 其中<qrSize>是一个实数,表示二维码边长 */ #include <opencv2/opencv.hpp> #include <opencv2/videoio.hpp> #include <zbar.h> #include <opencv/highgui.h> //二维码倾斜阈值 #define QRLOCATION_INCLINATION_THRESHOLD 0.1 //调试窗口标题 #define QRLOCATION_DEBUGUI_TITLE "debugui" //二维码位姿 typedef struct QRPose { //二维码中心所在铅垂线与O点构成的平面和Z轴形成的夹角 double a; //二维码所在平面与X轴构成的夹角 double b; //二维码中心到XOY平面的距离 double z; } QRPose_t; //二维码定位算法 class QRLocation { public: //初始化,第一个参数为摄像头编号,第二个参数为摄像头上下视角,第三个参数为是否开启调试窗口 bool init(int webcamIndex, double hViewAngle, bool debugUI); //获取二维码位姿 bool getQRPose(QRPose_t* qrPose); //销毁 bool destroy(); private: //摄像头 cv::VideoCapture capture; //摄像头上下视角 double hViewAngle; //是否开启调试窗口 bool debugUI; //灰度图 cv::Mat grayFrame; //图片扫描器 zbar::ImageScanner scanner; private: //计算位姿(格式合法性判断) bool getQRPose(zbar::Image::SymbolIterator symbol, QRPose_t* qrPose); //计算位姿(算法) bool getQRPose(zbar::Image::SymbolIterator symbol, double qrSize, QRPose_t* qrPose); }; #endif QRLocation.cpp #include <iostream> #include <opencv/highgui.h> #include "QRLocation.h" #include <string.h> #include <stdio.h> using namespace std; using namespace zbar; bool QRLocation::init(int webcamIndex, double hViewAngle, bool debugUI) { //打开摄像头 capture.open(webcamIndex); //摄像头不存在 if (!capture.isOpened()) { printf("camera open error \n"); return false; } //printf("point 2 \n"); this->hViewAngle = hViewAngle; this->debugUI = debugUI; //grayFrame=0; //配置zbar图片扫描器 scanner.set_config(zbar::ZBAR_NONE, zbar::ZBAR_CFG_ENABLE, 1); //printf("point 3 \n"); //如果开启调试,则创建窗口,名称为“debugui”,自动调整大小 if (debugUI) { cv::namedWindow(QRLOCATION_DEBUGUI_TITLE, CV_WINDOW_AUTOSIZE); } //printf("point 4 \n"); return 1; } bool QRLocation::getQRPose(QRPose_t* qrPose) { //从摄像头中抓取一帧 cv::Mat frame; capture.read(frame);; //图像为空 if (frame.empty()) { printf("read frame is empty!\n"); return false; } //printf("point 6 \n"); //如果灰度图没有创建,就创建一个和原图一样大小的灰度图(8位色深,单通道) //if (grayFrame.empty()) { grayFrame = cv::Mat(frame.size(), IPL_DEPTH_8U, 1); //} //原图转灰度图 //cv::cvtColor(frame, grayFrame, cv::COLOR_BGR2GRAY); cvtColor(frame, grayFrame, CV_RGB2GRAY); //printf("point 9 \n"); //如果开启调试,则显示灰度图 if (debugUI) { cv::imshow(QRLOCATION_DEBUGUI_TITLE, grayFrame); char c = cv::waitKey(30); } //printf("point 8 \n"); //创建zbar图像 uchar* data = frame.data; void *new_data = static_cast<void *>(data); Image image(frame.size().width, frame.size().height, "Y800", new_data, frame.size().width*frame.size().height); //printf("point 7 \n"); //扫描图像,识别二维码,获取个数 int symbolCount = scanner.scan(image); //获取第一个二维码 Image::SymbolIterator symbol = image.symbol_begin(); //遍历所有识别出来的二维码 while (symbolCount--) { //能够识别 if (getQRPose(symbol, qrPose)) return true; //下一个二维码 ++symbol; } return false; } bool QRLocation::getQRPose(Image::SymbolIterator symbol, QRPose_t* qrPose) { //首先得是一个二维码 if (symbol->get_type_name() != "QR-Code") printf("this is shit"); //获取内容 char data[128]; strncpy_s(data, symbol->get_data().c_str(), sizeof(data) - 1); data[sizeof(data) - 1] = 0; //内容得是以“QRLocation,”开头 if (strncmp(data, "QRLocation,", 11) != 0) return false; //获取二维码边长 double qrSize = 0; sscanf_s(data + 11, "%lf", &qrSize); if (qrSize == 0) return false; //计算位姿 return getQRPose(symbol, qrSize, qrPose); } bool QRLocation::getQRPose(Image::SymbolIterator symbol, double qrSize, QRPose_t* qrPose) { //获得四个点的坐标 double x0 = symbol->get_location_x(0); double y0 = symbol->get_location_y(0); double x1 = symbol->get_location_x(1); double y1 = symbol->get_location_y(1); double x2 = symbol->get_location_x(2); double y2 = symbol->get_location_y(2); double x3 = symbol->get_location_x(3); double y3 = symbol->get_location_y(3); //左边沿纵向差 double leftH = y1 - y0; //右边沿纵向差 double rightH = y2 - y3; //必须保证0点高于1点,3点高于2点 if (leftH<0 || rightH<0) return false; //左边沿横向差 double leftW = abs(x0 - x1); //右边沿横向差 double rightW = abs(x2 - x3); //不能太倾斜 if (max(leftW / leftH, rightW / rightH)>QRLOCATION_INCLINATION_THRESHOLD) return false; //上下视角一半的正切值,因为一直要用,所以先计算出来 double tanHalfView = tan(hViewAngle / 2); double leftLen = sqrt(leftH*leftH + leftW*leftW); double rightLen = sqrt(rightH*rightH + rightW*rightW); //左边沿的深度 double leftZ = grayFrame.size().height*qrSize / tanHalfView / 2 / leftLen; //右边沿的深度 double rightZ = grayFrame.size().height*qrSize / tanHalfView / 2 / rightLen; //得到中心点的深度 double z = (leftZ + rightZ) / 2; //计算b的正弦值 double sinB = (leftZ - rightZ) / qrSize; if (sinB>1) return false; //得到b double b = asin(sinB); //两条对角线的系数和偏移 double k1 = (y2 - y0) / (x2 - x0); double b1 = (x2*y0 - x0*y2) / (x2 - x0); double k2 = (y3 - y1) / (x3 - x1); double b2 = (x3*y1 - x1*y3) / (x3 - x1); //两条对角线交点的X坐标 double crossX = -(b1 - b2) / (k1 - k2); //计算a的正切值 double tanA = tanHalfView*(2 * crossX - grayFrame.size().width) / grayFrame.size().width; //得到a double a = atan(tanA); qrPose->a = a; qrPose->b = b; qrPose->z = z; return true; } //bool QRLocation::destroy() //{ //释放灰度图 //cvReleaseImage(&grayFrame); //销毁窗口 //cvDestroyWindow(QRLOCATION_DEBUGUI_TITLE); //释放内存 //cvReleaseCapture(&capture); //} QRLocationTest.cpp #include "QRLocation.h" #include <stdio.h> int main(int argc, char* argv[]) { //printf("point 1 \n"); QRLocation qrLoc; if (!qrLoc.init(0, 0.60, true)) { return 1; } //printf("point 5 \n"); QRPose_t pose; while (true) { if (qrLoc.getQRPose(&pose)) { double aInDegree = pose.a * 180 / 3.1415; double bInDegree = pose.b * 180 / 3.1415; printf("a=%.2lf,b=%.2lf,z=%.2lf\n", aInDegree, bInDegree, pose.z); } } }
用 ffmpeg命令行工具实现 屏幕与摄像头图像叠加(摄像头图像叠加上屏幕图右下角) 后推流命令,发现会卡,怎么解决呢?
问题:用 ffmpeg命令行工具实现 屏幕与摄像头图像叠加(摄像头图像叠加上屏幕图右下角) 后推流,发现会卡,怎么解决呢? 我的命令:ffmpeg -f gdigrab -framerate 30 -video_size 1920x1080 -i desktop -f dshow -framerate 30 -video_size 640x480 -i video="HD USB Camera" -filter_complex "overlay=main_w-overlay_w-10:main_h-overlay_h-10" -c:v libx264 -r 30 -b:v 1500k -pix_fmt yuv420p -tune zerolatency -preset ultrafast -f flv -y "rtmp://localhost/live/demo" 这里 "HD USB Camera" 是我的相机名称。 我发现跟命令中输入源的顺序有关,但是图像叠加是默认第一输入是背景图,第二输入是前景图的,所以若更换顺序,虽然不卡了,但却不能实现叠加效果,怎么办呢??另外因为某些原因我这里一定是使用 gdigrab 来捕获桌面的。
在ros上实时运行视觉slam,保存地图问题
环境:ubuntu16.04, ros kinetic, kinect v1 问题描述: 使用Kinect v1相机实时的运行由orb_slam2系统修改之后的视觉slam系统,现在无法保存运行之和的地图。有大神能帮助解决吗?最好给出具体代码 代码: ``` ```int main(int argc, char **argv) { ros::init(argc, argv, "RGBD"); ros::start(); if(argc != 3) { cerr << endl << "Usage: 1111" << endl; ros::shutdown(); return 1; } // 创建SLAM系统,并初始化所有的线程 ``` ``` orb_slam::System SLAM(argv[1],argv[2],orb_slam::System::RGBD,true); ImageGrabber igb(&SLAM); ros::NodeHandle nh; message_filters::Subscriber<sensor_msgs::Image> rgb_sub(nh, "/camera/rgb/image_color", 1); message_filters::Subscriber<sensor_msgs::Image> depth_sub(nh, "/camera/depth_registered/hw_registered/image_rect_raw", 1); typedef message_filters::sync_policies::ApproximateTime<sensor_msgs::Image, sensor_msgs::Image> sync_pol; message_filters::Synchronizer<sync_pol> sync(sync_pol(10), rgb_sub,depth_sub); sync.registerCallback(boost::bind(&ImageGrabber::GrabRGBD,&igb,_1,_2)); pcl::PointCloud<pcl::PointXYZRGBA>::Ptr global_map(new pcl::PointCloud<pcl::PointXYZRGBA>); global_map = SLAM.mpPointCloudMapping->GetGlobalMap(); pcl::PointCloud<pcl::PointXYZRGB>::Ptr global_map_copy(new pcl::PointCloud<pcl::PointXYZRGB>); // signal(SIGINT, MySigintHandler); while(ros::ok())//使用ros::ok()与ros::spinOnce()搭配实现回调 { pcl::copyPointCloud(*global_map, *global_map_copy); //向topic : /orb_slam_with_kinect1/output 发送信息,发送频率为loop_rate(10),即10hz,消息池最大容量为10. ros::Publisher pcl_pub = nh.advertise<sensor_msgs::PointCloud2> ("/orb_slam_with_kinect1/output", 10); sensor_msgs::PointCloud2 output; // 转换成ROS下的数据类型 最终通过topic发布 pcl::toROSMsg(*global_map_copy,output); output.header.stamp=ros::Time::now(); output.header.frame_id ="camera_rgb_frame"; ros::Rate loop_rate(10); pcl_pub.publish(output); ros::spinOnce(); loop_rate.sleep(); } // 保存轨迹与地图 SLAM.save(); SLAM.Shutdown(); SLAM.SaveTrajectoryTUM("CameraTrajectory.txt"); ros::shutdown(); return 0; } ``` ```
怎么使用MediaStore获取SD卡中Camera下的照片
怎么使用MediaStore获取SD卡中DCIM/Camera目录下的照片?我使用 ` Cursor track = mContext.getContentResolver().query( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null, null, null);` 得到的是SD卡中全部的图片,可是我只想获取到DCIM/Camera目录下的图片应该怎么办?
130 个相见恨晚的超实用网站,一次性分享出来
相见恨晚的超实用网站 持续更新中。。。
我花了一夜用数据结构给女朋友写个H5走迷宫游戏
起因 又到深夜了,我按照以往在csdn和公众号写着数据结构!这占用了我大量的时间!我的超越妹妹严重缺乏陪伴而 怨气满满! 而女朋友时常埋怨,认为数据结构这么抽象难懂的东西没啥作用,常会问道:天天写这玩意,有啥作用。而我答道:能干事情多了,比如写个迷宫小游戏啥的! 当我码完字准备睡觉时:写不好别睡觉! 分析 如果用数据结构与算法造出东西来呢? ...
对计算机专业来说学历真的重要吗?
我本科学校是渣渣二本,研究生学校是985,现在毕业五年,校招笔试、面试,社招面试参加了两年了,就我个人的经历来说下这个问题。 这篇文章很长,但绝对是精华,相信我,读完以后,你会知道学历不好的解决方案,记得帮我点赞哦。 先说结论,无论赞不赞同,它本质就是这样:对于技术类工作而言,学历五年以内非常重要,但有办法弥补。五年以后,不重要。 目录: 张雪峰讲述的事实 我看到的事实 为什么会这样 ...
字节跳动视频编解码面经
三四月份投了字节跳动的实习(图形图像岗位),然后hr打电话过来问了一下会不会opengl,c++,shador,当时只会一点c++,其他两个都不会,也就直接被拒了。 七月初内推了字节跳动的提前批,因为内推没有具体的岗位,hr又打电话问要不要考虑一下图形图像岗,我说实习投过这个岗位不合适,不会opengl和shador,然后hr就说秋招更看重基础。我当时想着能进去就不错了,管他哪个岗呢,就同意了面试...
win10系统安装教程(U盘PE+UEFI安装)
一、准备工作 u盘,电脑一台,win10原版镜像(msdn官网) 二、下载wepe工具箱 极力推荐微pe(微pe官方下载) 下载64位的win10 pe,使用工具箱制作启动U盘打开软件, 选择安装到U盘(按照操作无需更改) 三、重启进入pe系统 1、关机后,将U盘插入电脑 2、按下电源后,按住F12进入启动项选择(技嘉主板是F12) 选择需要启...
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
Python——画一棵漂亮的樱花树(不同种樱花+玫瑰+圣诞树喔)
最近翻到一篇知乎,上面有不少用Python(大多是turtle库)绘制的树图,感觉很漂亮,我整理了一下,挑了一些我觉得不错的代码分享给大家(这些我都测试过,确实可以生成) one 樱花树 动态生成樱花 效果图(这个是动态的): 实现代码 import turtle as T import random import time # 画樱花的躯干(60,t) def Tree(branch, ...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小人工智障。 思路可以运用在不同地方,主要介绍的是思路。
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
Ol4网格生成以及优化
概述 先描述一下大致场景:以0.05为单元格大小生成网格,并在地图上绘制,绘制的时候需要区分海陆。本文以此需求为契机,简单描述一下该需求的实现以及如何来优化。 效果 实现 优化前 var source = new ol.source.Vector({ features: [] }); var vector = new ol.layer.Vector({ source...
11月19日科技资讯|华为明日发布鸿蒙整体战略;京东宣告全面向技术转型;Kotlin 1.3.60 发布
「极客头条」—— 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧。扫描上方二维码进入 CSDN App 可以收听御姐萌妹 Style 的人工版音频哟。 一分钟速览新闻点! 6G 专家组成员:速率是 5G 的 10 至 100 倍,预计 2030 年商用 雷军:很多人多次劝我放弃WPS,能坚持下来并不是纯粹的商业决定 ...
C语言魔塔游戏
很早就很想写这个,今天终于写完了。 游戏截图: 编译环境: VS2017 游戏需要一些图片,如果有想要的或者对游戏有什么看法的可以加我的QQ 2985486630 讨论,如果暂时没有回应,可以在博客下方留言,到时候我会看到。 下面我来介绍一下游戏的主要功能和实现方式 首先是玩家的定义,使用结构体,这个名字是可以自己改变的 struct gamerole { char n...
iOS Bug 太多,苹果终于坐不住了!
开源的 Android 和闭源的 iOS,作为用户的你,更偏向哪一个呢? 整理 | 屠敏 出品 | CSDN(ID:CSDNnews) 毋庸置疑,当前移动设备操作系统市场中,Android 和 iOS 作为两大阵营,在相互竞争的同时不断演进。不过一直以来,开源的 Android 吸引了无数的手机厂商涌入其中,为其生态带来了百花齐放的盛景,但和神秘且闭源的 iOS 系统相比,不少网友...
Python语言高频重点汇总
Python语言高频重点汇总 GitHub面试宝典仓库 回到首页 目录: Python语言高频重点汇总 目录: 1. 函数-传参 2. 元类 3. @staticmethod和@classmethod两个装饰器 4. 类属性和实例属性 5. Python的自省 6. 列表、集合、字典推导式 7. Python中单下划线和双下划线 8. 格式化字符串中的%和format 9. 迭代器和生成器 10...
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观...
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip installselenium -ihttps://pypi.tuna.tsinghua.edu.cn/simple/ ...
程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca...
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆每天早上8:30推送 作者|Mr.K 编辑| Emma 来源|技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯...
程序员该看的几部电影
1、骇客帝国(1999) 概念:在线/离线,递归,循环,矩阵等 剧情简介: 不久的将来,网络黑客尼奥对这个看似正常的现实世界产生了怀疑。 他结识了黑客崔妮蒂,并见到了黑客组织的首领墨菲斯。 墨菲斯告诉他,现实世界其实是由一个名叫“母体”的计算机人工智能系统控制,人们就像他们饲养的动物,没有自由和思想,而尼奥就是能够拯救人类的救世主。 可是,救赎之路从来都不会一帆风顺,到底哪里才是真实的世界?如何...
蓝桥杯知识点汇总:基础知识和常用算法
文章目录基础语法部分:算法竞赛常用API:算法部分数据结构部分 此系列包含蓝桥杯绝大部分所考察的知识点,以及真题题解~ 基础语法部分: 备战蓝桥杯java(一):一般输入输出 和 快速输入输(BufferedReader&amp;BufferedWrite) 备战蓝桥杯java(二):java编程规范和常用数据类型 备战蓝桥杯java(三):常用功能符以及循环结构和分支结构 备战蓝桥杯java(四...
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东...
@程序员,如何花式构建线程?
作者 |曾建责编 | 郭芮出品 | CSDN(ID:CSDNnews)在项目和业务的开发中,我们难免要经常使用线程来进行业务处理,使用线程可以保证我们的业务在相互处理之间可以保证原子性...
破14亿,Python分析我国存在哪些人口危机!
一、背景 二、爬取数据 三、数据分析 1、总人口 2、男女人口比例 3、人口城镇化 4、人口增长率 5、人口老化(抚养比) 6、各省人口 7、世界人口 四、遇到的问题 遇到的问题 1、数据分页,需要获取从1949-2018年数据,观察到有近20年参数:LAST20,由此推测获取近70年的参数可设置为:LAST70 2、2019年数据没有放上去,可以手动添加上去 3、将数据进行 行列转换 4、列名...
实现简单的轮播图(单张图片、多张图片)
前言 刚学js没多久,这篇博客就当做记录了,以后还会完善的,希望大佬们多多指点。ps:下面出现的都是直接闪动,没有滑动效果的轮播图。 单张图片的替换 · ...
强烈推荐10本程序员在家读的书
很遗憾,这个春节注定是刻骨铭心的,新型冠状病毒让每个人的神经都是紧绷的。那些处在武汉的白衣天使们,尤其值得我们的尊敬。而我们这些窝在家里的程序员,能不外出就不外出,就是对社会做出的最大的贡献。 有些读者私下问我,窝了几天,有点颓丧,能否推荐几本书在家里看看。我花了一天的时间,挑选了 10 本我最喜欢的书,你可以挑选感兴趣的来读一读。读书不仅可以平复恐惧的压力,还可以对未来充满希望,毕竟苦难终将会...
Linux自学篇——linux命令英文全称及解释
man: Manual 意思是手册,可以用这个命令查询其他命令的用法。 pwd:Print working directory 意思是密码。 su:Swith user 切换用户,切换到root用户 cd:Change directory 切换目录 ls:List files 列出目录下的文件 ps:Process Status 进程状态 mkdir:Make directory ...
Python实战:抓肺炎疫情实时数据,画2019-nCoV疫情地图
今天,群里白垩老师问如何用python画武汉肺炎疫情地图。白垩老师是研究海洋生态与地球生物的学者,国家重点实验室成员,于不惑之年学习python,实为我等学习楷模。先前我并没有关注武汉肺炎的具体数据,也没有画过类似的数据分布图。于是就拿了两个小时,专门研究了一下,遂成此文。
疫情数据接口api
返回json示例 { "errcode":0,//0标识接口正常 "data":{ "date":"2020-01-30 07:47:23",//实时更新时间 "diagnosed":7736,//确诊人数 "suspect":12167,//疑是病例人数 "death":170,//死亡人数 "cur...
相关热词 c# 识别回车 c#生成条形码ean13 c#子控制器调用父控制器 c# 写大文件 c# 浏览pdf c#获取桌面图标的句柄 c# list反射 c# 句柄 进程 c# 倒计时 线程 c# 窗体背景色
立即提问