Python+OpenCV实现增强现实!快来召唤你的库洛牌!!!

相信大家都看过或者听过《摩卡少女樱》这部动漫,是不是非常羡慕小樱能够从库洛牌中召唤出各种各样会有魔法的人呀?!

今天,博主就来教教大家如何实现召唤吧!!!学会以后相信你一定可以召唤神龙滴!!

召唤其实是一种几何投影,将虚拟三维模型投射到图像上。它需要先对图像(也就是库洛牌)进行标定,确定投影和图像的相对位置,保证即使图像方向变了,大小变了,也可以实现召唤!!!然后我们设置一些相机参数,让我们真实世界的三维空间和图像上的二维空间对应上。最后,我们将三维图像(会魔法的人)投影到图像(库洛牌)上的指定区域就完成了召唤!!!废话不多说,直接上代码!!!

Step1:召唤一个立方体

from pylab import *
from PIL import Image
import pickle
# 如果您安装了PCV,这些导入应该有效
from PCV.geometry import homography, camera
from PCV.localdescriptors import siftdef cube_points(c, wid):""" 创建用于绘制立方体的一个点列表。 (前5个点是底部正方形,一些边重合了)。 """p = []# 底部p.append([c[0]-wid, c[1]-wid, c[2]-wid])p.append([c[0]-wid, c[1]+wid, c[2]-wid])p.append([c[0]+wid, c[1]+wid, c[2]-wid])p.append([c[0]+wid, c[1]-wid, c[2]-wid])p.append([c[0]-wid, c[1]-wid, c[2]-wid]) #为了绘制闭合图像,和第一个相同# 顶部p.append([c[0]-wid, c[1]-wid, c[2]+wid])p.append([c[0]-wid, c[1]+wid, c[2]+wid])p.append([c[0]+wid, c[1]+wid, c[2]+wid])p.append([c[0]+wid, c[1]-wid, c[2]+wid])p.append([c[0]-wid, c[1]-wid, c[2]+wid]) #为了绘制闭合图像,和第一个相同# 竖直边p.append([c[0]-wid, c[1]-wid, c[2]+wid])p.append([c[0]-wid, c[1]+wid, c[2]+wid])p.append([c[0]-wid, c[1]+wid, c[2]-wid])p.append([c[0]+wid, c[1]+wid, c[2]-wid])p.append([c[0]+wid, c[1]+wid, c[2]+wid])p.append([c[0]+wid, c[1]-wid, c[2]+wid])p.append([c[0]+wid, c[1]-wid, c[2]-wid])return array(p).Tdef my_calibration(sz):"""本例中使用的相机(iPhone4)的校准功能。"""row, col = szfx = 2555*col/2592fy = 2586*row/1936K = diag([fx, fy, 1])K[0, 2] = 0.5*col#标定中心点K[1, 2] = 0.5*row#标定中心点return K# 计算特征点
sift.process_image('D:/test/book_frontal.JPG', 'im0.sift')
l0, d0 = sift.read_features_from_file('im0.sift')sift.process_image('D:/test/book_perspective.JPG', 'im1.sift')
l1, d1 = sift.read_features_from_file('im1.sift')#匹配特征,并计算单应性矩阵
matches = sift.match_twosided(d0, d1)
ndx = matches.nonzero()[0]
fp = homography.make_homog(l0[ndx, :2].T)
ndx2 = [int(matches[i]) for i in ndx]
tp = homography.make_homog(l1[ndx2, :2].T)model = homography.RansacModel()
H, inliers = homography.H_from_ransac(fp, tp, model)#计算照相机标定矩阵
K = my_calibration((747, 1000))# 位于边长为0.2,z=0平面上的三维点
box = cube_points([0, 0, 0.1], 0.1)# 投影第一幅图像上底部的正方形
cam1 = camera.Camera(hstack((K, dot(K, array([[0], [0], [-1]])))))
# 底部正方形上的点
box_cam1 = cam1.project(homography.make_homog(box[:, :5]))#使用H将点变换到第二幅图像上
box_trans = homography.normalize(dot(H,box_cam1))#从cam1和H中计算第二个张相机矩阵
cam2 = camera.Camera(dot(H, cam1.P))
A = dot(linalg.inv(K), cam2.P[:, :3])
A = array([A[:, 0], A[:, 1], cross(A[:, 0], A[:, 1])]).T
cam2.P[:, :3] = dot(K, A)# 使用第二个照相机矩阵投影
box_cam2 = cam2.project(homography.make_homog(box))# 可视化
im0 = array(Image.open('D:/test/book_frontal.JPG'))
im1 = array(Image.open('D:/test/book_perspective.JPG'))#底部正方形的二维投影
figure()
imshow(im0)
plot(box_cam1[0, :], box_cam1[1, :], linewidth=3)
title('2D projection of bottom square')
axis('off')#使用H对二维投影进行变换
figure()
imshow(im1)
plot(box_trans[0, :], box_trans[1, :], linewidth=3)
title('2D projection transfered with H')
axis('off')#三维立方体
figure()
imshow(im1)
plot(box_cam2[0, :], box_cam2[1, :], linewidth=3)
title('3D points projected in second image')
axis('off')show()

           

首先,我们在第一张图像标定出一个正方形。然后,我们通过sift特征匹配和单应性变换(博主之前已经详细讲述过啦,传送通道:https://blog.csdn.net/qq_40369926/article/details/88597406  https://blog.csdn.net/qq_40369926/article/details/88918489)找到第一张图片和第二张图像的对应关系,将第一张图像标定的正方形标定到第二张图像上,我们可以看到第一张图像中正方形和书的位置和大小对应关系,和第二张图像中正方形的大小对应关系是一致的。最后,我们以第二张图像的正方形为底面投影出一个正方体,这样就实现了简单的三维立方体的召唤!!!

Step2:召唤一个茶壶

from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
import pygame,pygame.image
from pygame.locals import *
import pickle
import math
from pylab import *
from PCV.geometry import homography, camera
from PCV.localdescriptors import siftdef cube_points(c, wid):""" 创建用于绘制立方体的一个点列表。 (前5个点是底部正方形,一些边重合了)。 """p = []# 底部p.append([c[0]-wid, c[1]-wid, c[2]-wid])p.append([c[0]-wid, c[1]+wid, c[2]-wid])p.append([c[0]+wid, c[1]+wid, c[2]-wid])p.append([c[0]+wid, c[1]-wid, c[2]-wid])p.append([c[0]-wid, c[1]-wid, c[2]-wid]) #为了绘制闭合图像,和第一个相同# 顶部p.append([c[0]-wid, c[1]-wid, c[2]+wid])p.append([c[0]-wid, c[1]+wid, c[2]+wid])p.append([c[0]+wid, c[1]+wid, c[2]+wid])p.append([c[0]+wid, c[1]-wid, c[2]+wid])p.append([c[0]-wid, c[1]-wid, c[2]+wid]) #为了绘制闭合图像,和第一个相同# 竖直边p.append([c[0]-wid, c[1]-wid, c[2]+wid])p.append([c[0]-wid, c[1]+wid, c[2]+wid])p.append([c[0]-wid, c[1]+wid, c[2]-wid])p.append([c[0]+wid, c[1]+wid, c[2]-wid])p.append([c[0]+wid, c[1]+wid, c[2]+wid])p.append([c[0]+wid, c[1]-wid, c[2]+wid])p.append([c[0]+wid, c[1]-wid, c[2]-wid])return array(p).Tdef my_calibration(sz):"""本例中使用的相机(iPhone4)的校准功能。"""row, col = szfx = 2555*col/2592fy = 2586*row/1936K = diag([fx, fy, 1])K[0, 2] = 0.5*col#标定中心点K[1, 2] = 0.5*row#标定中心点return Kdef set_projection_from_camera(K):"""从照相机标定矩阵获得视图"""glMatrixMode(GL_PROJECTION)glLoadIdentity()fx=K[0,0]fy=K[1,1]fovy=2*math.atan(0.5*height/fy)*180/math.piaspect=(width*fy)/(height*fx)#定义近的和远的剪裁平面near=0.1far=100.0#设定透视gluPerspective(fovy,aspect,near,far)glViewport(0,0,width,height)def set_modelview_from_camera(Rt):"""从照相机姿态中获得模拟视图矩阵"""glMatrixMode(GL_MODELVIEW)glLoadIdentity()#围绕x轴将茶壶旋转90度,使z轴向上Rx=np.array([[1,0,0],[0,0,-1],[0,1,0]])#获得旋转的最佳逼近R=Rt[:,:3]U,S,V=linalg.svd(R)R=dot(U,V)R[0,:]=-R[0,:]#改变x轴的符号#获得平移量t=Rt[:,3]#获得4*4的模拟视图矩阵M=eye(4)M[:3,:3]=dot(R,Rx)M[:3,3]=t#转置并压平以获取序列数值M=M.Tm=M.flatten()#将模拟视图矩阵替换为新的矩阵glLoadMatrixf(m)def draw_background(imname):"""使用四边形绘制背景图像"""#载入背景图像(应该是.bmp格式),转换为OpenGL纹理bg_image=pygame.image.load(imname).convert()bg_data=pygame.image.tostring(bg_image,"RGBX",1)glMatrixMode(GL_MODELVIEW)glLoadIdentity()glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)#绑定纹理glEnable(GL_TEXTURE_2D)glBindTexture(GL_TEXTURE_2D,glGenTextures(1))glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,width,height,0,GL_RGBA,GL_UNSIGNED_BYTE,bg_data)glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST)glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST)#创建四方形填充整个窗口glBegin(GL_QUADS)glTexCoord2f(0.0,0.0);glVertex3f(-1.0,-1.0,-1.0)glTexCoord2f(1.0,0.0);glVertex3f(1.0,-1.0,-1.0)glTexCoord2f(1.0,1.0);glVertex3f(1.0,1.0,-1.0)glTexCoord2f(0.0,1.0);glVertex3f(-1.0,1.0,-1.0)glEnd()#清除纹理glDeleteTextures(1)def draw_teapot(size):"""在原点处绘制红色茶壶"""glEnable(GL_LIGHTING)glEnable(GL_LIGHT0)glEnable(GL_DEPTH_TEST)glClear(GL_DEPTH_BUFFER_BIT)#绘制红色茶壶glMaterialfv(GL_FRONT,GL_AMBIENT,[0,0.2,0.2,0])#材质的环境颜色glMaterialfv(GL_FRONT,GL_DIFFUSE,[0.8,0.8,0.8,1.0])#材质的散射颜色glMaterialfv(GL_FRONT,GL_SPECULAR,[0.7,0.6,0.6,0.0])#材料的镜面反射颜色glMaterialfv(GL_FRONT,GL_SHININESS,0.25*128.0)#镜面反射指数glutSolidTeapot(size)width,height=1000,747def setup():""""设置窗口和pygame环境"""pygame.init()pygame.display.set_mode((width,height),OPENGL | DOUBLEBUF)pygame.display.set_caption('OpenGL AR demo')# 计算特征点
sift.process_image('D:/test/book_frontal.JPG', 'im0.sift')
l0, d0 = sift.read_features_from_file('im0.sift')sift.process_image('D:/test/book_perspective.JPG', 'im1.sift')
l1, d1 = sift.read_features_from_file('im1.sift')#匹配特征,并计算单应性矩阵
matches = sift.match_twosided(d0, d1)
ndx = matches.nonzero()[0]
fp = homography.make_homog(l0[ndx, :2].T)
ndx2 = [int(matches[i]) for i in ndx]
tp = homography.make_homog(l1[ndx2, :2].T)model = homography.RansacModel()
H, inliers = homography.H_from_ransac(fp, tp, model)#计算照相机标定矩阵
K = my_calibration((747, 1000))# 位于边长为0.2,z=0平面上的三维点
box = cube_points([0, 0, 0.1], 0.1)# 投影第一幅图像上底部的正方形
cam1 = camera.Camera(hstack((K, dot(K, array([[0], [0], [-1]])))))
# 底部正方形上的点
box_cam1 = cam1.project(homography.make_homog(box[:, :5]))#使用H将点变换到第二幅图像上
box_trans = homography.normalize(dot(H,box_cam1))#从cam1和H中计算第二个张相机矩阵
cam2 = camera.Camera(dot(H, cam1.P))
A = dot(linalg.inv(K), cam2.P[:, :3])
A = array([A[:, 0], A[:, 1], cross(A[:, 0], A[:, 1])]).T
cam2.P[:, :3] = dot(K, A)Rt=dot(linalg.inv(K),cam2.P)setup()
draw_background('D:/test/book_perspective.bmp')
set_projection_from_camera(K)
set_modelview_from_camera(Rt)
draw_teapot(0.10)pygame.display.flip()
while True:event=pygame.event.poll()if event.type ==pygame.QUIT:sys.exit()

召唤茶壶和召唤立方体的前两步是一样的,只是最后一步投影的不是一个立方体,而是一个茶壶,茶壶比立方体要复杂一些。我们先要对茶壶这个模型有一些基础的设置,比如大小、颜色、表面纹理等。

Step3:召唤一只狐狸(动态投影)

1.objloader_simple.py

objloader_simple.py用于在python中载入obj模型(3D模型),前面的茶壶就是一个obj模型,我们可以在http://www.oyonale.com/modeles.php?lang=en&format=OBJ中下载你想要的各种obj模型。

class OBJ:def __init__(self, filename, swapyz=False):"""Loads a Wavefront OBJ file. """self.vertices = []self.normals = []self.texcoords = []self.faces = []material = Nonefor line in open(filename, "r"):if line.startswith('#'): continuevalues = line.split()if not values: continueif values[0] == 'v':v = map(float, values[1:4])if swapyz:v = v[0], v[2], v[1]self.vertices.append(v)elif values[0] == 'vn':v = map(float, values[1:4])if swapyz:v = v[0], v[2], v[1]self.normals.append(v)elif values[0] == 'vt':self.texcoords.append(map(float, values[1:3]))#elif values[0] in ('usemtl', 'usemat'):#material = values[1]#elif values[0] == 'mtllib':#self.mtl = MTL(values[1])elif values[0] == 'f':face = []texcoords = []norms = []for v in values[1:]:w = v.split('/')face.append(int(w[0]))if len(w) >= 2 and len(w[1]) > 0:texcoords.append(int(w[1]))else:texcoords.append(0)if len(w) >= 3 and len(w[2]) > 0:norms.append(int(w[2]))else:norms.append(0)#self.faces.append((face, norms, texcoords, material))self.faces.append((face, norms, texcoords))

2.main.py


# Useful links
# http://www.pygame.org/wiki/OBJFileLoader
# https://rdmilligan.wordpress.com/2015/10/15/augmented-reality-using-opencv-opengl-and-blender/
# https://clara.io/library# TODO -> Implement command line arguments (scale, model and object to be projected)
#      -> Refactor and organize code (proper funcition definition and separation, classes, error handling...)import argparseimport cv2
import numpy as np
import math
import os
from objloader_simple import *# Minimum number of matches that have to be found
# to consider the recognition valid
MIN_MATCHES = 10  def main():"""This functions loads the target surface image,"""homography = None # matrix of camera parameters (made up but works quite well for me) camera_parameters = np.array([[800, 0, 320], [0, 800, 240], [0, 0, 1]])# create ORB keypoint detectororb = cv2.ORB_create()# create BFMatcher object based on hamming distance  bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)# load the reference surface that will be searched in the video streamdir_name = os.getcwd()model = cv2.imread(os.path.join(dir_name, 'D:/test/models.jpg'), 0)# Compute model keypoints and its descriptorskp_model, des_model = orb.detectAndCompute(model, None)# Load 3D model from OBJ fileobj = OBJ(os.path.join(dir_name, 'D:/test/models/fox.obj'), swapyz=True)  # init video capturecap = cv2.VideoCapture(0)while True:# read the current frameret, frame = cap.read()if not ret:print "Unable to capture video"return # find and draw the keypoints of the framekp_frame, des_frame = orb.detectAndCompute(frame, None)# match frame descriptors with model descriptorsmatches = bf.match(des_model, des_frame)# sort them in the order of their distance# the lower the distance, the better the matchmatches = sorted(matches, key=lambda x: x.distance)# compute Homography if enough matches are foundif len(matches) > MIN_MATCHES:# differenciate between source points and destination pointssrc_pts = np.float32([kp_model[m.queryIdx].pt for m in matches]).reshape(-1, 1, 2)dst_pts = np.float32([kp_frame[m.trainIdx].pt for m in matches]).reshape(-1, 1, 2)# compute Homographyhomography, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)if args.rectangle:# Draw a rectangle that marks the found model in the frameh, w = model.shapepts = np.float32([[0, 0], [0, h - 1], [w - 1, h - 1], [w - 1, 0]]).reshape(-1, 1, 2)# project corners into framedst = cv2.perspectiveTransform(pts, homography)# connect them with lines  frame = cv2.polylines(frame, [np.int32(dst)], True, 255, 3, cv2.LINE_AA)  # if a valid homography matrix was found render cube on model planeif homography is not None:try:# obtain 3D projection matrix from homography matrix and camera parametersprojection = projection_matrix(camera_parameters, homography)  # project cube or modelframe = render(frame, obj, projection, model, False)#frame = render(frame, model, projection)except:pass# draw first 10 matches.if args.matches:frame = cv2.drawMatches(model, kp_model, frame, kp_frame, matches[:10], 0, flags=2)# show resultcv2.imshow('frame', frame)if cv2.waitKey(1) & 0xFF == ord('q'):breakelse:print "Not enough matches found - %d/%d" % (len(matches), MIN_MATCHES)cap.release()cv2.destroyAllWindows()return 0def render(img, obj, projection, model, color=False):"""Render a loaded obj model into the current video frame"""vertices = obj.verticesscale_matrix = np.eye(3) * 3h, w = model.shapefor face in obj.faces:face_vertices = face[0]points = np.array([vertices[vertex - 1] for vertex in face_vertices])points = np.dot(points, scale_matrix)# render model in the middle of the reference surface. To do so,# model points must be displacedpoints = np.array([[p[0] + w / 2, p[1] + h / 2, p[2]] for p in points])dst = cv2.perspectiveTransform(points.reshape(-1, 1, 3), projection)imgpts = np.int32(dst)if color is False:cv2.fillConvexPoly(img, imgpts, (137, 27, 211))else:color = hex_to_rgb(face[-1])color = color[::-1]  # reversecv2.fillConvexPoly(img, imgpts, color)return imgdef projection_matrix(camera_parameters, homography):"""From the camera calibration matrix and the estimated homographycompute the 3D projection matrix"""# Compute rotation along the x and y axis as well as the translationhomography = homography * (-1)rot_and_transl = np.dot(np.linalg.inv(camera_parameters), homography)col_1 = rot_and_transl[:, 0]col_2 = rot_and_transl[:, 1]col_3 = rot_and_transl[:, 2]# normalise vectorsl = math.sqrt(np.linalg.norm(col_1, 2) * np.linalg.norm(col_2, 2))rot_1 = col_1 / lrot_2 = col_2 / ltranslation = col_3 / l# compute the orthonormal basisc = rot_1 + rot_2p = np.cross(rot_1, rot_2)d = np.cross(c, p)rot_1 = np.dot(c / np.linalg.norm(c, 2) + d / np.linalg.norm(d, 2), 1 / math.sqrt(2))rot_2 = np.dot(c / np.linalg.norm(c, 2) - d / np.linalg.norm(d, 2), 1 / math.sqrt(2))rot_3 = np.cross(rot_1, rot_2)# finally, compute the 3D projection matrix from the model to the current frameprojection = np.stack((rot_1, rot_2, rot_3, translation)).Treturn np.dot(camera_parameters, projection)def hex_to_rgb(hex_color):"""Helper function to convert hex strings to RGB"""hex_color = hex_color.lstrip('#')h_len = len(hex_color)return tuple(int(hex_color[i:i + h_len // 3], 16) for i in range(0, h_len, h_len // 3))# Command line argument parsing
# NOT ALL OF THEM ARE SUPPORTED YET
parser = argparse.ArgumentParser(description='Augmented reality application')parser.add_argument('-r','--rectangle', help = 'draw rectangle delimiting target surface on frame', action = 'store_true')
parser.add_argument('-mk','--model_keypoints', help = 'draw model keypoints', action = 'store_true')
parser.add_argument('-fk','--frame_keypoints', help = 'draw frame keypoints', action = 'store_true')
parser.add_argument('-ma','--matches', help = 'draw matches between keypoints', action = 'store_true')
# TODO jgallostraa -> add support for model specification
#parser.add_argument('-mo','--model', help = 'Specify model to be projected', action = 'store_true')args = parser.parse_args()if __name__ == '__main__':main()

实现动态投影第一步也是先输入一张图像,确定标定指定位置,然后从摄像头输入图像,实现摄像头获取的图像和第一张图像的映射。最后,将狐狸投射到书上。这样就实现了狐狸跃然书上,这里博主偷了一个小懒,没有设置狐狸的纹理等信息,你们可以参考茶壶的设置,按照自己的喜欢,修改狐狸的各种参数设置。从视频中可以看出,当我们移动书的时候,狐狸会随书而动,它和书的相对位置基本没发生改变,说明我们基本实现了召唤,再也不用羡慕小樱啦,甚至还可以召唤神龙!!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1620418.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Logstash【从无到有从有到无】【简介】【L2】Logstash入门

目录 1.Logstash入门 1.1.安装Logstash 1.1.1.从下载的二进制安装 1.1.2.从包存储库安装 1.1.3.使用Homebrew在Mac上安装Logstash 1.1.4.使用Homebrew启动Logstash 1.1.5.Docker 1.2.简单使用 1.3.用Logstash解析日志 1.3.1.配置Filebeat以将日志行发送到Logstash 1…

dojo框架笔记

一、模块定义 1、定义只含值对,没有任何依赖的模块(moudle1.js) define({ color: "black", size: "unisize" }); 2、定义没有任何依赖,但是需要一个准备活动的函数(moudle2.js) define…

Flutter技术与实战(5)

Flutter进阶 文章目录 Flutter进阶如何构造炫酷的动画效果Animation、AnimationController与ListenerAnimationWidget与AnimationBuilderhero动画 单线程模型怎么保证UI运行流畅Event Loop机制异步任务异步函数Isolate HTTP网络编程与JSON解析HTTP网络编程HttpClienthttpdioJSO…

Styling FX Buttons with CSS

http://fxexperience.com/2011/12/styling-fx-buttons-with-css/ ———————————————————————————————————————————————————————— Styling FX Buttons with CSS December 20, 2011 By Jasper Potts A number of people h…

使用机器学习模型对大盘指数进行预测

作者:子楠 链接:https://zhuanlan.zhihu.com/p/24417597 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 用数学模型分析策略,可以避免由于情绪波动的造成的影响,避免一些…

大盘趋势图强弱分析 通达信大盘多空指标公式 副图不加密

判断大盘走势图的四大技巧有哪些? 答:1.消息面、政策面、经济面。2.技术面。技术面上最重要的是成交量。3.利用领涨股。一般一波行情的发展都会由一只或几只领涨股引领,对他们本身进行分析进而了解市场主力所盯紧的热点,然后判断…

通达信 红线精准主升浪波段买卖选股指标 蝶形飞扬副图公式源码

波段神器,无未来,信号极其准确,不是好用的指标不好分享给大家! 这是指标用于显示选股下单的信号,只显示安全的做多做空信号,所以信号较少,少而准!对比一下就知道了! 一个能及时提示上涨和下跌,有兴趣的朋友可以下载来试试! 指标用…

R实战:【实战分析】大盘历年几月是行情?

有人说每年的5月份是下跌行情,11月份左右会有个吃饭行情,是这样的吗?还是用事实来说话吧 R实战系列专栏 百度云下载:本文R脚本和数据文件

java 获得 大盘 开盘_教你利用开盘十分钟判定当日大盘强弱(建议收藏!)

深沪两市都可以用通过市场要素快速排序的方法告诉我们市场的真正实质。市场量价要素排序的功能是专业选手快速掌握市场真正情况的窗口,也是专业看盘的标准次序。本文教你利用开盘十分钟判定当日大盘强弱! 1,第一板个股涨幅 深沪两市都可以用通…

涨跌的例题用C语言编辑,涨跌比率指标用法及源代码(ADR)

ADR指标又叫涨跌比率指标或上升下降比指标,其英文全称是“Advance Decline Ratio”。和ADL指标一样,是专门研究股票指数走势的中长期技术分析工具。 涨跌比率ADR指标是将一定时期内上市交易的全部股票中的上涨加数和下跌加数进行比较,得出上涨…

北向资金能预示大盘涨跌?【附Python源码】

01 引言 中国证监会于 2014 年和 2016 年分别批准了沪港通和深港通,建立了大陆和香港股市的互联互通机制,市场通常把沪股通和深股通的合计流入资金称为北向资金。换句话说,北上资金就是指从香港流入大陆股市的资金,而内地流入香港…

利用随机森林预测股票大盘涨跌

本文仅从实战角度去观察,利用机器学习算法中,随机森林模型预测股票市场指数涨跌的准确率。 适合入门玩家 首先,我们导入所需要的模块 import numpy as np import pandas as pd import talib as ta #金融数据计算 import datetime,pickle …

大盘涨跌预测及仓位控制思考

今天分享一篇个人在大盘涨跌上的预测及通过涨跌预测延伸的仓位控制思考。 大盘的择时个人一直认为是股票量化中最重要的部分(普通的策略)。一个好的择时方法,虽然可能会让部分盈利变少,但能够大大的降低回撤。很多策略虽然有很高…

[第七届蓝帽杯全国大学生网络安全技能大赛 蓝帽杯 2023]——Web方向部分题 详细Writeup

Web LovePHP 你真的熟悉PHP吗&#xff1f; 源码如下 <?php class Saferman{public $check True;public function __destruct(){if($this->check True){file($_GET[secret]);}}public function __wakeup(){$this->checkFalse;} } if(isset($_GET[my_secret.flag]…

想要买一款手机!得先用爬虫爬取一下他的评论是否值得买!

1. 网站分析 本文实现的爬虫是抓取京东商城指定苹果手机的评论信息。使用 requests 抓取手机评论 API 信息&#xff0c;然后通过 json 模块的相应 API 将返回的 JSON 格式的字符串转换为 JSON 对象&#xff0c;并提取其中感兴趣的信息。读者可以点击此处打开 京东商城&#xf…

Web前端期末大作业-在线手机商城网站设计(HTML+CSS+JS)

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

优秀网站看前端 —— 小米Note介绍页面

刚开始经营博客的时候&#xff0c;我写过不少“扒皮”系列的文章&#xff0c;主要介绍一些知名站点上有趣的交互效果&#xff0c;然后试着实现它们。后来开始把注意力挪到一些新颖的前端技术上&#xff0c;“扒皮”系列便因此封笔多时。今天打算重开“扒皮”的坑&#xff0c;不…

爬取五大平台621款手机,告诉你双十一在哪买最便宜!

↑关注置顶~ 有趣的不像个技术号 今晚0点&#xff0c;相约剁手 大家好&#xff0c;我是朱小五 明天就是双十一了&#xff0c;看了看自己手里的卡的像IE浏览器的手机&#xff0c;感觉可能等不到5G普及了。 我&#xff01;要&#xff01;换&#xff01;手&#xff01;机&#xff…

宁花4000买手机 不花6元买游戏

宁花4000买手机 不花6元买游戏 2012-03-22 09:17 0评论 阅读数&#xff1a;1005 单独窗口打印放大字号缩小字号 千变万变&#xff0c;国情不变。曾经毁了中国PC游戏市场的那些东西&#xff0c;如今又在iOS游戏市场一一重现&#xff1a;盗版、外挂、抄袭、强制消费、恶意竞争………

买手机选择困难症,Python数据分析帮你解决

每年各大品牌旗舰机发布都是一大热点&#xff0c;特别是前几天发布的iPhone Xs Max算是手机界的大新闻了&#xff0c;新款iPhone的价格也再度刷新了手机定价的记录。看完发布会&#xff0c;相信很多人的心情是这样的&#xff08;文末爬虫资料赠送&#xff09; 我一朋友鱼哥之前…