基于Opencv的银行卡号识别系统的设计与实现_第1页
基于Opencv的银行卡号识别系统的设计与实现_第2页
基于Opencv的银行卡号识别系统的设计与实现_第3页
基于Opencv的银行卡号识别系统的设计与实现_第4页
基于Opencv的银行卡号识别系统的设计与实现_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于OpenCV的银行卡号识别系统设计与实现摘要通过输入银行卡号进行绑定是电子货币的互通的基础,但在越来越讲究效率的现在,如何快速的输入卡号成为人们的关注点。因而,本设计设计了一个银行卡号识别系统,该系统完成了银行卡号的识别。该系统是建立在OpenCV基础上的,对拍摄图片进行许多图像处理后得到银行卡号位置,然后切割图片得到该区域,最后采用深度学习的识别模型对其识别,得到识别结果并进行输出。通过多次识别结果对比,证明该系统具有较快的识别速度和较高的准确率,同时识别结果相对稳定。关键词银行卡卡号图像处理深度学习DesignandImplementationofBankCardNumberIdentificationSystemBasedonOpenCVAbstract:Theidentificationofbankcardnumbersisthebasisfortherealizationofe-commerceandelectronicmoney.Therefore,howtoquicklyandaccuratelyidentifybankcardnumbersautomaticallybecomesanimportantkeytechnologyTherefore,thisdesigndesignsabankcardnumberidentificationsystem,thesystemcompletesthebankcardnumberidentification.ThesystemisbuiltonthebasisofOpenCV.Aftermanyimageprocessingofthepicturestaken,thebankcardnumberpositionisobtained,andthentheimageiscuttoobtaintheregion.Finally,therecognitionmodelofdeeplearningisusedtoidentifytheimage,andtherecognitionresultisobtainedandoutput.Throughthecomparisonofrecognitionresultsformanytimes,itisprovedthatthesystemhasfastrecognitionspeedandhighaccuracy,andtherecognitionresultsarerelativelystable.KeywordsbankcardnumberImageprocessingdeeplearning目录TOC\o"1-3"\h\u引言 附录Image.pyimportcv2

importnumpyasnp

#银行卡图像处理

classImage:

HEIGHT=550

WIDTH=350

img=0

remove_back_img=0

number_area=0

def__init__(self,img):

self.img=img

H,W,_=img.shape

ifH/W>0.6andH/W<0.69:

self.remove_back_img=cv2.resize(self.img,(self.HEIGHT,self.WIDTH))

else:

self.remove_back_img=self.removeBackground()

self.number_area=self.position(self.remove_back_img)

self.pos_img=self.getNumberArea()

defgetNumberArea(self):

num_img=self.number_area

h,w,_=num_img.shape

gray_img=cv2.cvtColor(num_img,cv2.COLOR_BGR2GRAY)

dilate_img=self.embossment(gray_img)

embo_img=cv2.medianBlur(dilate_img,3)

_,thresh_img=cv2.threshold(embo_img,155,255,cv2.THRESH_BINARY)

thresh_img=cv2.medianBlur(thresh_img,3)

thresh_img=cv2.GaussianBlur(thresh_img,(3,3),0)

thresh_img=cv2.dilate(thresh_img,None,iterations=10)

_,thresh_img=cv2.threshold(thresh_img,220,255,cv2.THRESH_BINARY)

a=np.zeros(w,np.uint8)

forjinrange(0,w):

foriinrange(0,h):

ifthresh_img[i,j]==0:

a[j]+=1

a=a[::-1]

length=int(0.75*w)

min_=sum(a)

start=0

foriinrange(len(a)):

ifa[i]<15:

a[i]=0

else:

a[i]=35

foriinrange(w-length):

end=i+length

mean_=a[i:end].mean()

if(min_>mean_andi<50):

min_=mean_

start=i

end=w-start

a=a[::-1]

min_=sum(a)

start=0

foriinrange(130):

mean_=a[i:end].mean()

ifmin_>mean_:

min_=mean_

start=i

self.W_end=end+20

self.W_start=start+25

returnnum_img[:,start+5:end]

defremoveBackground(self):

resize_img=cv2.resize(self.img,(self.HEIGHT,self.WIDTH),0,0,cv2.INTER_NEAREST)

self.img=resize_img

gray_img=cv2.cvtColor(resize_img,cv2.COLOR_BGR2GRAY)

blur_img=cv2.medianBlur(gray_img,9)

x=cv2.Sobel(blur_img,cv2.CV_32F,1,0,3)

y=cv2.Sobel(blur_img,cv2.CV_32F,0,1,3)

absX=cv2.convertScaleAbs(x)

absY=cv2.convertScaleAbs(y)

sobel_img=cv2.addWeighted(absX,0.5,absY,0.5,0)

thresh_img=cv2.adaptiveThreshold(sobel_img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,3,

0)

tmp=cv2.findContours(thresh_img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

iflen(tmp)==2:

cnts,_=tmp

else:

_,cnts,_=tmp

temp=0

W=0

H=0

X=0

Y=0

foriinrange(0,len(cnts)):

x,y,w,h=cv2.boundingRect(cnts[i])

if(temp<w+h):

temp=w+h

W=w

H=h

X=x

Y=y

remove_back_img=resize_img[Y:Y+H,X:X+W]

returncv2.resize(remove_back_img,(self.HEIGHT,self.WIDTH),cv2.INTER_NEAREST)

defembossment(self,img):

H,W=img.shape

dst=np.zeros((H,W),np.uint8)

foriinrange(0,H):

forjinrange(0,W-1):

grayP0=int(img[i,j])

grayP1=int(img[i,j+1])

newP=grayP0-grayP1+150

ifnewP>255:

newP=255

ifnewP<0:

newP=0

dst[i,j]=newP

returndst

defhorizontal(self,img):

H,W=img.shape

hor_array=np.zeros(H,32)

forjinrange(0,H):

foriinrange(0,W):

ifimg[j,i]==0:

hor_array[j]+=1

returnhor_array

defgetArea(self,array):

H=len(array)

label_H=int(H/10)

min_=sum(array)

ans=0

foriinrange(int(1/2*H)-label_H):

a=int(2/5*H)+i

b=int(2/5*H)+i+label_H

mean=array[a:b].mean()

ifmean<min_:

ans=a

min_=mean

ifa>0.6*H:

returnans,ans+label_H

defposition(self,img):

gray_img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

gray_img=cv2.dilate(gray_img,None,iterations=2)

gray_img=cv2.erode(gray_img,None,iterations=2)

emboss_img=self.embossment(gray_img)

sobel_x=cv2.Sobel(emboss_img,cv2.CV_32F,1,0,3)

sobel_y=cv2.Sobel(emboss_img,cv2.CV_32F,0,1,3)

absX=cv2.convertScaleAbs(sobel_x)

absY=cv2.convertScaleAbs(sobel_y)

sobel_img=cv2.addWeighted(absX,0.5,absY,0.5,0)

sobel_img=cv2.medianBlur(sobel_img,11)

sobel_img=cv2.dilate(sobel_img,None,iterations=2)

_,threshold=cv2.threshold(sobel_img,10,255,cv2.THRESH_BINARY)

threshold=cv2.GaussianBlur(threshold,(9,9),0)

pixel_array=self.horizontal(threshold)

start,end=self.getArea(pixel_array)

self.H_start=start

self.H_end=end

res=img[start:end,20:]

returnresModel.pyimportkeras

fromkeras.layersimportLambda,Dense,Bidirectional,GRU,Flatten,TimeDistributed,Permute,Activation,Input

fromkeras.layersimportLSTM,Reshape,Conv2D,MaxPooling2D,BatchNormalization,ZeroPadding2D

fromkerasimportbackendasK

importnumpyasnp

importos

importtensorflowastf

defctc_loss_layer(args):

y_true,y_pred,pred_length,label_length=args

batch_cost=K.ctc_batch_cost(y_true,y_pred,pred_length,label_length)

returnbatch_cost

defmodel(is_training=True,img_shape=(32,256,1),num_classes=11,max_label_length=26):

initializer=keras.initializers.he_normal()

picture_height,picture_width,picture_channel=img_shape

#CNNpart

inputs=Input(shape=(picture_height,picture_width,picture_channel),name='pic_inputs')

x=Conv2D(64,(3,3),strides=(1,1),padding="same",kernel_initializer=initializer,use_bias=True,

name='conv2d_1')(inputs)

x=BatchNormalization(name="BN_1")(x)

x=Activation("relu",name="relu_1")(x)

x=MaxPooling2D(pool_size=(2,2),strides=2,padding='valid',name='maxpl_1')(x)

x=Conv2D(128,(3,3),strides=(1,1),padding="same",kernel_initializer=initializer,use_bias=True,

name='conv2d_2')(x)

x=BatchNormalization(name="BN_2")(x)

x=Activation("relu",name="relu_2")(x)

x=MaxPooling2D(pool_size=(2,2),strides=2,padding='valid',name='maxpl_2')(x)

x=Conv2D(256,(3,3),strides=(1,1),padding="same",kernel_initializer=initializer,use_bias=True,

name='conv2d_3')(x)

x=BatchNormalization(name="BN_3")(x)

x=Activation("relu",name="relu_3")(x)

x=Conv2D(256,(3,3),strides=(1,1),padding="same",kernel_initializer=initializer,use_bias=True,

name='conv2d_4')(x)

x=BatchNormalization(name="BN_4")(x)

x=Activation("relu",name="relu_4")(x)

x=MaxPooling2D(pool_size=(2,1),strides=(2,1),name='maxpl_3')(x)

x=Conv2D(512,(3,3),strides=(1,1),padding="same",kernel_initializer=initializer,use_bias=True,

name='conv2d_5')(x)

x=BatchNormalization(axis=-1,name='BN_5')(x)

x=Activation("relu",name='relu_5')(x)

x=Conv2D(512,(3,3),strides=(1,1),padding="same",kernel_initializer=initializer,use_bias=True,

name='conv2d_6')(x)

x=BatchNormalization(axis=-1,name='BN_6')(x)

x=Activation("relu",name='relu_6')(x)

x=MaxPooling2D(pool_size=(2,1),strides=(2,1),name='maxpl_4')(x)

x=Conv2D(512,(2,2),strides=(1,1),padding='same',activation='relu',kernel_initializer=initializer,

use_bias=True,name='conv2d_7')(x)

x=BatchNormalization(name="BN_7")(x)

x=Activation("relu",name="relu_7")(x)

conv_otput=MaxPooling2D(pool_size=(2,1),name="conv_output")(x)

x=Permute((2,3,1),name='permute')(conv_otput)

rnn_input=TimeDistributed(Flatten(),name='for_flatten_by_time')(x)

#RNNpart

y=Bidirectional(LSTM(256,kernel_initializer=initializer,return_sequences=True),merge_mode='sum',

name='LSTM_1')(rnn_input)

y=BatchNormalization(name='BN_8')(y)

y=Bidirectional(LSTM(256,kernel_initializer=initializer,return_sequences=True),name='LSTM_2')(y)

y_pred=Dense(num_classes,activation='softmax',name='y_pred')(y)

base_model=keras.models.Model(inputs=inputs,outputs=y_pred)

y_true=Input(shape=[max_label_length],name='y_true')

y_pred_length=Input(shape=[1],name='y_pred_length')

y_true_length=Input(shape=[1],name='y_true_length')

ctc_loss_output=Lambda(ctc_loss_layer,output_shape=(1,),name='ctc_loss_output')(

[y_true,y_pred,y_pred_length,y_true_length])

model=keras.models.Model(inputs=[y_true,inputs,y_pred_length,y_true_length],outputs=ctc_loss_output)

ifis_training:

returnmodel

else:

returnbase_modelApp.py#-*-coding:utf-8-*-

importsys

fromPyQt5importQtCore,QtGui,QtWidgets

fromPyQt5.QtWidgetsimportQMessageBox,QDesktopWidget,QGraphicsPixmapItem,QFileDialog,QGraphicsScene,QApplication

fromPyQt5.QtGuiimportQPixmap,QImage

fromPyQt5.QtCoreimportQt

fromgraphicsimportGraphicsView,GraphicsPixmapItem

importcv2

importnumpyasnp

fromImageimportImage

frompredictimportsingle_recognition

model_dir='./trainning/crnn.h5'

classUi_MainWindow(object):

defsetupUi(self,MainWindow):

MainWindow.setObjectName("MainWindow")

MainWindow.setWindowTitle("银行卡卡号识别")

MainWindow.setFixedSize(825,570)

center=QDesktopWidget().screenGeometry()

MainWindow.move((center.width()-825)/2,(center.height()-570)/2)

MainWindow.resize(825,617)

self.centralwidget=QtWidgets.QWidget(MainWindow)

self.centralwidget.setObjectName("centralwidget")

self.verticalLayoutWidget_2=QtWidgets.QWidget(self.centralwidget)

self.verticalLayoutWidget_2.setGeometry(QtCore.QRect(670,190,151,341))self.verticalLayoutWidget_2.setObjectName("verticalLayoutWidget_2")

self.verticalLayout_2=QtWidgets.QVBoxLayout(self.verticalLayoutWidget_2)

self.verticalLayout_2.setContentsMargins(0,0,0,0)

self.verticalLayout_2.setObjectName("verticalLayout_2")

self.pushButton_3=QtWidgets.QPushButton(self.verticalLayoutWidget_2)

self.pushButton_3.setObjectName("pushButton_3")

self.verticalLayout_2.addWidget(self.pushButton_3)

self.pushButton_2=QtWidgets.QPushButton(self.verticalLayoutWidget_2)

self.pushButton_2.setObjectName("pushButton_2")

self.verticalLayout_2.addWidget(self.pushButton_2)

self.pushButton_4=QtWidgets.QPushButton(self.verticalLayoutWidget_2)

self.pushButton_4.setObjectName("pushButton_4")

self.verticalLayout_2.addWidget(self.pushButton_4)

self.pushButton=QtWidgets.QPushButton(self.verticalLayoutWidget_2)

self.pushButton.setObjectName("pushButton")

self.verticalLayout_2.addWidget(self.pushButton)

self.graphicsView=GraphicsView(self.centralwidget)

self.graphicsView.setEnabled(True)

self.graphicsView.setGeometry(QtCore.QRect(10,180,552,352))

self.graphicsView.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)

self.graphicsView.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)

self.graphicsView.setObjectName("graphicsView")

self.graphicsView_3=QtWidgets.QGraphicsView(self.centralwidget)

self.graphicsView_3.setGeometry(QtCore.QRect(10,30,502,52))

self.graphicsView_3.setObjectName("graphicsView_3")

self.label=QtWidgets.QTextEdit(self.centralwidget)

self.label.setGeometry(QtCore.QRect(10,100,502,52))

self.label.setObjectName("label")self.label.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)

self.radioButton=QtWidgets.QRadioButton(self.centralwidget)

self.radioButton.setGeometry(QtCore.QRect(550,150,112,23))

self.radioButton.setObjectName("radioButton")

MainWindow.setCentralWidget(self.centralwidget)

self.menubar=QtWidgets.QMenuBar(MainWindow)

self.menubar.setGeometry(QtCore.QRect(0,0,825,28))

self.menubar.setObjectName("menubar")

MainWindow.setMenuBar(self.menubar)

self.statusbar=QtWidgets.QStatusBar(MainWindow)

self.statusbar.setObjectName("statusbar")

MainWindow.setStatusBar(self.statusbar)

self.action=QtWidgets.QAction(MainWindow)

self.action.setObjectName("action")

self.action_2=QtWidgets.QAction(MainWindow)

self.action_2.setObjectName("action_2")

self.retranslateUi(MainWindow)

QtCore.QMetaObject.connectSlotsByName(MainWindow)

defretranslateUi(self,MainWindow):

_translate=QtCore.QCoreApplication.translate

MainWindow.setWindowTitle(_translate("MainWindow","MainWindow"))

MainWindow.setStyleSheet("QMainWindow{background:#66B3FF}")self.graphicsView.setStyleSheet("QGraphicsView{background:#66B3FF}")self.graphicsView_3.setStyleSheet("QGraphicsView{background:#66B3FF}")

self.graphicsView.setLineWidth(3)

self.graphicsView.setMidLineWidth(5)

self.graphicsView_3.setLineWidth(3)

self.graphicsView_3.setMidLineWidth(5)

self.pushButton_3.setText(_translate("MainWindow","打开图片"))

self.pushButton_3.setIcon(QtGui.QIcon("icons/open.svg"))

self.pushButton_3.setIconSize(QtCore.QSize(20,20))

self.pushButton_3.setStyleSheet("QPushButton{background:#16A085;border:none;color:#000000;font-size:15px;}"

"QPushButton:hover{background-color:#008080;}")

self.pushButton_2.setText(_translate("MainWindow","卡号定位"))

self.pushButton_2.setIcon(QtGui.QIcon("icons/locate.svg"))

self.pushButton_2.setIconSize(QtCore.QSize(20,20))self.pushButton_2.setStyleSheet("QPushButton{background:#FFA500;border:none;color:#000000;font-size:15px;}"

"QPushButton:hover{background-color:#D26900;}")

self.pushButton_4.setText(_translate("MainWindow","卡号识别"))

self.pushButton_4.setIcon(QtGui.QIcon("icons/bank_card.svg"))

self.pushButton_4.setIconSize(QtCore.QSize(20,20))self.pushButton_4.setStyleSheet("QPushButton{background:#9F35FF;border:none;color:#000000;font-size:15px}"

"QPushButton:hover{background-color:#9932CC;}")

self.pushButton.setText(_translate("MainWindow","退出"))

self.pushButton.setIcon(QtGui.QIcon("icons/close_.svg"))

self.pushButton.setIconSize(QtCore.QSize(20,20))self.pushButton.setStyleSheet("QPushButton{background:#CE0000;border:none;color:#000000;font-size:15px;}"

"QPushButton:hover{background-color:#8B0000;}")

self.label.setText("银行卡卡号")

self.label.setFrameShape(QtWidgets.QFrame.Box)

self.label.setLineWidth(3)

self.label.setMidLineWidth(5)

font=QtGui.QFont()

font.setBold(True)

font.setPointSize(13)

font.setWeight(75)

self.label.setFont(font)

self.label.setAlignment(Qt.AlignCenter)

self.radioButton.setText(_translate("MainWindow","手动定位"))

self.pushButton.clicked.connect(self.close)

self.pushButton_3.clicked.connect(self.clickOpen)

self.pushButton_2.clicked.connect(self.clickLocation)

self.pushButton_4.clicked.connect(self.recognition)

self.radioButton.setCheckable(True)

self.radioButton.toggled.connect(self.checkbox)

self.messageBox=QMessageBox()self.messageBox.setStyleSheet("QMessageBox{background-color:#CE0000;border:none;color:#000000;font-size:15px;}")

defclose(self):

reply=self.messageBox.question(None,"Quit","确定要关闭该程序?",QMessageBox.Yes|QMessageBox.No,QMessageBox.No)

ifreply==QMessageBox.Yes:

sys.exit()

defclickOpen(self):

imgName,imgType=QFileDialog.getOpenFileName(None,"打开图片","","*.jpg;;*.png;;*.jpeg;;AllFiles(*)")

img=cv2.imread(imgName)

self.image=Image(img)

self.img=self.image.pos_img

H,W,C=self.image.img.shape

P=3*W

qimage=QImage(self.image.img.data,W,H,P,QImage.Format_RGB888).rgbSwapped()

pixmap=QPixmap.fromImage(qimage)

self.graphicsView.setSceneRect(0,0,550,350)

self.graphicsView.setItem(pixmap)

self.graphicsView.Scene()self.graphicsView.setStyleSheet("QGraphicsView{background-color:#66B3FF}")

defclickLocation(self):

ifself.radioButton.isChecked()==False:

self.graphicsView.viewport().setProperty("cursor",QtGui.QCursor(QtCore.Qt.ArrowCursor))

Img=self.image.pos_img

self.img=Img

Img=cv2.resize(Img,(500,50),cv2.INTER_NEAREST)

H,W,_=Img.shape

P=3*W

Img=QImage(Img.data,W,H,P,QImage.Format_RGB888).rgbSwapped()

pixmap=QPixmap.fromImage(Img)

Item=QGraphicsPixmapItem(pixmap)

self.graphicsView_3Scene=QGraphicsScene()

self.graphicsView_3Scene.addItem(Item)

self.graphicsView_3.setSceneRect(0,0,500,50)self.graphicsView_3.setStyleSheet("QGraphicsView{background-color:#66B3FF}")

self.graphicsView_3.setScene(self.graphicsView_3Scene)

backImg=self.image.remove_back_img.copy()cv2.rectangle(backImg,(self.image.W_start,self.image.H_start),(self.image.W_end,self.image.H_end),(0,0,255),2)

backImg=cv2.resize(backImg,(550,350),cv2.INTER_NEAREST)

H,W,_=backImg.shape

P=3*W

backImg=QImage(backImg.data,W,H,P,QImage.Format_RGB888).rgbSwapped()

pixmap=QPixmap.fromImage(backImg)

self.graphicsView.setItem(pixmap)

self.graphicsView.Scene()

else:

backImg=self.image.remove_back_img.copy()

Img=backImg[int(self.graphicsView.image_item.start_point.y()):int(self.graphicsView.image_item.end_point.y()),

int(self.graphicsView.image_item.start_point.x()):int(self.graphicsView.image_item.end_point.x())]

Img=cv2.resize(Img,(500,50),cv2.INTER_NEAREST)

self.img=Img

Img=QImage(Img.data,500,50,1500,QImage.Format_RGB888).rgbSwapped()

pixmap=QPixmap.fromImage(Img)

Item=QGraphicsPixmapItem(pixmap)

self.graphicsView_3Scene=QGraphicsScene()

self.graphicsView_3Scene.addItem(Item)

self.graphicsView_3.setSceneRect(0,0,500,50)

self.graphicsView_3.setStyleSheet("QGraphicsView{background-color:#66B3FF}")

self.graphicsView_3.setScene(self.graphicsView_3Scene)

defcheckbox(self):

ifself.radioButton.isChecked()==True:

self.graphicsView.viewport().setProperty("cursor",QtGui.QCursor(QtCore.Qt.CrossCursor))

backImg=self.image.remove_back_img

backImg=cv2.resize(backImg,(550,350),cv2.INTER_NEAREST)

H,W,_=backImg.shape

P=3*W

backImg=QImage(backImg.data,W,H,P,QImage.Format_RGB888).rgbSwapped()

pixmap=QPixmap.fromImage(backImg)

self.graphicsView.setItem(pixmap)

self.graphicsView.Scene()

self.graphicsView.image_item.setStart(True)

print(self.graphicsView.image_item.isStart)

elifself.radioButton.isChecked()==False:

self.graphicsView.image_item.setStart(False)

self.graphicsView.viewport().setProperty("cursor",QtGui.QCursor(QtCore.Qt.ArrowCursor))

defrecognition(self):

img=self.img

res=single_recognition(img,model_dir)

self.label.setText(res)

self.label.setAlignment(Qt.AlignCenter)Run.py#-*-coding:utf-8-*-

importsys

fromPyQt5.QtWidgetsimportQApplication,QMainWindow

fromappimport*

if__name__=='__main__':

app=QApplication(sys.argv)

MainWindow=QMainWindow()

ui=Ui_MainWindow()

ui.setupUi(MainWindow)

MainWindow.setWindowTitle("银行卡卡号识别")

MainWindow.show()

sys.exit(app.exec_())

HYPERLINK如何选择组装电脑配件

如何选择组装的电脑配件.

第一,选择好CPU平台,就是INTER还是AMD,看你是要配什么样的电脑,高端还是低端的,两个平台都高低的产品。第二,选择主板了,主板的品牌比较多,质量,价格也不一,当你第一步却定了,那么主板也就相应的却定下来了,以INTER为例,只可以选择775接口的主板(早期有478接口的,不推荐),主板的选择主要有两种,一是集成显卡,二是不集成显卡。集成显卡的话,就可以省下显卡的钱,但是对游戏玩家不推荐。那么当然是选择不集成显卡的主板了,而且最好选择一线品牌,如华硕,技嘉等。主板里,还有个蕊片组的选择。关于蕊片组,各个品牌的主板命名有些不一样,主流是INTER965,945,915,VIA的KT890,还有NFORCE4,NFORCE5。等。比较难说清楚。最好是选择INTER的蕊片组,虽然价格会稍高一些。推荐945,技术比较成熟。第三,显卡的选择。显卡主要还是有两类品牌,GEFORCE和ATI,两个品牌有高,中,低的显卡。显卡选择要看你个人喜欢了,预算充足的话,最好是买中,高端的显卡。

第四,就是内存了,内存关系电脑的稳定性。当然是要好一点的。买一线品牌的。现在配电脑,主流是DDR667,DDR800DDR1333第五,显示器的选择,推荐液晶。如何选择硬件组装电脑这是一个老生常谈的问题了,这也是一个让高手们显示自己硬件功底的问题,同时这还是一个让很多新手为之焦头烂额的问题。该怎么配?具体配什么?怎样配才能尽量减小瓶颈?本文就将从内到外,从理论到实践,为朋友们抽丝剥茧一一道来。

一、CPU

作为一台电脑最关键的组成部分,CPU确实起着举足轻重的作用,但体现一台电脑的综合速度,并不是仅仅依靠CPU的,常常看到很多新手们在配电脑的时候,把CPU选的很好,但其他的东西诸如内存、主板、硬盘等都选的不太理想,好像这台电脑速度的快慢就体现在CPU速度的快慢上似的。甚至很多著名的品牌机厂商,都推出过类似“P4+256M内存”的这种跛脚配置。其实对于一般的家用电脑而言,一个真正会配的高手,是不会把大量的钱花在CPU上的。家用电脑,毕竟不是做密集型科学计算用的,它讲求的是多种媒体的配合工作,讲求的是能一边下载文件、一边上网浏览网页、一边听音乐、一边还能打开其他的程序,在这种情况下,提升内存的容量比提升CPU的主频对速度的影响要明显的多。现今的中国家庭用户,很多家长对于电脑一窍不通,他们只听说“奔四”代表着速度快,并不知道整机速度的快慢除了CPU以外,还有很多其他的因素影响着它。但在买电脑的时候,最后做决定并掏钱的人,往往都是这些啥都不懂的家长们,于是就出现了上面的一幕:品牌机厂商为了能有更好的销路、兼容机装机店的销售人员为了能拿到更多的奖金,开始违背良心来配置出这种高主频处理器、低容量内存的跛脚电脑。说严重点,这是属于对消费者的不负责任,是一种商业欺诈行为!同样5000元的配置,高手配出来的赛扬,比新手配出来的P4还要快很多,曾经有一家全球著名的硬件网站在2003年的时候刊登过一篇关于配置家用电脑时各硬件占用总预算百分比的文章,文中很明确的提到了CPU的价钱最好不要超过总预算的10%-15%,我们虽然不能说他肯定完全正确,但至少人家是通过很多调查后得出的结论,有借鉴的理由。反观现在的很多所谓的“低价奔四电脑”、“3999元买P4品牌机”之类的广告,我想说的就是:你花了3999元,只买了一块P4的处理器,其他的什么都没有了!

二、内存

对于配置一台电脑来说,内存是重头戏,容量、速度、类型等等每一项指标都对最终的整机综合速度起着至关重要的影响,尤其是内存的带宽和容量。对于内存带宽而言,很多人都认为400MHz、533MHz前端总线的赛扬四或P4,配单通道的DDR内存就足够了,双通道DDR内存是配合800MHz以上前端总线的P4处理器用的,其实这样就大错特错了,哪怕是最老的赛扬四,都需要双通道的DDR内存才能达到它的带宽!也就是说,你如果选择赛扬四1.8G,必须配合865以上的主板和至少双通道DDR200的内存,才能满足它的带宽要求!稍微计算一下就可以得知:赛扬四1.8G的前端总线是400MHz,它的内存带宽理论值是400MHz×64bit÷8=3.2G/s,但当它装在845系列的主板上时,由于845主板的限制,即使你插上能符合它带宽要求的DDR400内存,也只能运行在DDR266上,这时的内存所能提供的带宽是266MHz×64bit÷8=2.1G/s,比3.2G/s要小很多,即使你通过BIOS里的内存调节选项往上调节一档(也只能调节一档而已),让内存运行在DDR333下,所能提供的带宽也仅仅是333MHz×64bit÷8=2.66G/s,离3.2G/s还是有一定的距离,而内存带宽的降低,能非常明显的降低整机的综合速度,运行任何程序都能明显的感觉出来!所以如果想满足赛扬1.8G处理器的内存带宽要求,你必须要为它配置865以上的主板和双通道的内存才行!P4亦是如此。很多人也许会问:那845系列的主板是配什么处理器的呢?我想回答你的就是:845系列的主板是属于“不能用”的主板,因为处理器永远比主板发展的快,当初Intel造出845系列的芯片组是为了能给当时的赛扬和P4提供一个过渡的平台,不至于让它们成为“没有主板配合”的处理器而已,也是为了能在低端市场分一杯羹,而现今865甚至9xx系列的主板横行的时候,845系列的主板确实是属于“不能用”的主板了,满足不了任何一款处理器的内存带宽,造成性能上的严重低下,试问这种主板你会选择么?即使配台2000多元的超低价电脑,也不要去选择845系列的主板,至少需要865以上的和双通道内存才行,因为内存带宽是一个非常影响系统性能的参数,倘若一味的为了省钱而配置845系列的主板,那就得不偿失了。

内存的容量方面,应每个人对电脑的使用方向不同,容量的要求也是不同的,现在配置的家用电脑,笔者建议:如果不打游戏,或者是打打扫雷、纸牌之类的游戏,平时注重于上网浏览或者是聊天、看电影之类的应用的话,内存容量不应该低于1G;如果是偶尔打打单机游戏或者是网络游戏,内存容量应该选择在2G左右,如果是经常打大型的游戏或是进行HDTV视频编辑等应用,那么4G的内存是必不可少的。

三、主板

一台电脑的稳定性和兼容性,一大部分是看主板的,一款优秀的主板不仅需要拥有上等的用料和优良的做工,还需要拥有合理的走线设计,那些没有技术实力的三、四线主板厂家生产的主板,多数是采用公版走线,而且用料非常差,稳定性不堪一击,这种类型的主板,笔者建议宁愿不买电脑也不要配这种主板,否则以后将会是个淘气的祖宗。对于家庭用户,主板方面一定不能省钱,预算够的话最好能买个一线的主板品牌,如果预算实在不足,二线的主板是底线了,不要再往下选择了,毕竟家用电脑是用来使用的,不是用来整天维修的。再谈到主板的用料,笔者常常看到很多新手在配置主板的时候,貌似老鸟似的说某某品牌的主板好,某某品牌的不好,试问你知道它好在哪里么?不好在哪里么?这个就要看主板的用料了,虽然用料好的主板并不能代表一定是高档主板,但最少能代表它的电气性能出色。举一个很简单的例子吧:有A、B两款主板,A主板的处理器供电滤波电容采用的是日系电容,B主板的处理器供电滤波电容采用的是台系电容,那么基本上可以肯定的是:如果在电源输出电压的波动范围比较大的情况下,A主板就比较能耐得住,而B主板就很容易产生电容鼓包、漏夜等情况。不要小看这小小的电容,笔者从一个开维修店的朋友那里得知,来维修主板的人,有80%的都是这几个小电容损坏,究其原因,就是电源选择的不好,导致了输出电压的不稳定,久而久之最终导致这几个小电容爆浆,并且详细叙述了主板的品牌:“一线厂家的×硕牌主板就很少出现这种情况,但同样为一线厂家的×星牌主板,经常遇到!原因就是前者的大部分主板使用的是日系电容,而后者的大部分主板为了省钱,选用的是台系电容!”厂家的广告不能信,宣传也不能信,看到一个产品的广告之后,你所能相信的唯一一点就是:地球上有这么个产品的存在!然后其他的就统统都不能信了!网上有好多所谓的“评测”文章,都是枪手写的,基本上没有任何参考余地,只能作为一篇小说来读,一款主板的真正性能,只有你自己使用了之后才能知道。厂家为了销量、商家为了利润,他们能把最最垃圾的主板宣传为最顶级的产品,笔者曾经就看到过一款四线品牌的主板厂商,在对其主流主板的广告上说“最优秀的设计、最精湛的工艺、最稳定的性能”……结果一看报价:550元/块……其他的话我也不想多说了,只想问问这家厂商:你这么垃圾的主板都用了三个“最”字,那么华硕的同芯片组主板,售价是你三倍的,应该用什么词语来描述了??中国有一句古话:一分钱一分货,说的非常正确!不要认为价格高的主板就是暴利产品,从市场经济学上说,暴利产品是不会被市场所接受的,之所以他能存活到今天,而且售价依然是这么高,肯定有他的理由,他在做工用料方面肯定比其他品牌的要好很多,成本高所以售价高,在此,笔者奉劝大家一句:买主板千万不要凭侥幸心理,认为自己能花很少的钱买到很好的东西,只有错买的没有错卖的,商家永远都比你精明!主板上面还是老老实实的多花点钱来买个一线产品吧,否则以后有你吃苦的时候!

四、硬盘

现在的电脑,硬盘的速度当之无愧的成为了“第一大瓶颈”,无论你是再高的高手,配电脑的时候也无法消除这个瓶颈的存在,我们只有尽量的减小…再减小……。对于家用电脑的硬盘来说,容量和速度是两个非常重要的参数,容量上而言,笔者建议:如果你的电脑只是上网浏览浏览、偶尔打打小游戏的,那么160G的硬盘是个不错的选择;如果你常常下载软件或电影,那么250G的硬盘是个不错的选择,如果你是个下载狂人,那么400G的硬盘比较适合你;如果你有DV或者是经常编辑大型的视频文件,那么400G×2比较适合你,如果你是个玩HDTV的人,那么恭喜你,400G×4也许你都不够用。对于硬盘容量上的选择,你不能考虑现在是否够用,你应该考虑未来的1年里是否够用,大概的公式是:现在需要的容量×3。也就是说,如果你现在感觉80G的硬盘差不多够用了,那么你就需要买个250G的硬盘。如果你现在感觉120G的硬盘够用了,那么就去买个400G的硬盘吧。硬盘另外的一个参数就是速度,受到内部传输率等诸多因素的限制,一块硬盘的实际传输速度是不可能达到它的接口速度的,现在的并口硬盘基本上都是ATA133了,串口硬盘也都是150了,但民用级硬盘的实际传输速度最快的也还没突破66M/s,所以跟内存相比,硬盘的速度是电脑中最大的瓶颈,那么怎么来减小这个瓶颈呢?于是人们就发明了RAID,就是磁盘阵列(当然RAID不是仅仅为了这个而发明的),用两块一模一样的硬盘来组成RAID0,速度理论上能提高1倍,虽然实际上是不可能达到1倍的,但至少能非常非常明显的感觉到了硬盘速度的提升,笔者建议:如果你买的主板是带有RAID功能的,并且你需要保存的数据不是很重要的话,那么强烈建议你在预算允许的情况下购买两块硬盘来组建RAID0,这将使你能亲身体会到飞机与火车的速度差别!但最好是串口的,如果是并口的话,因为并口走的是PCI总线,由于PCI总线上的设备比较多,所以速度不可能达到比较高的地步,但如果是串口的话,那么硬盘的速度提升将更加明显!

五、显示器

显示器方面,笔者想澄清一个观念:曾经听过非常多的人说液晶显示器保护眼睛,因为没有辐射和闪烁……包括很多业内人士都这么认为的,其实错了,液晶显示器比普通的CRT还要伤眼睛!因为伤眼睛不仅仅是辐射和闪烁,还有对比度、亮度等参数,虽然液晶显示器的辐射和闪烁比CRT要小的多,但它那要命的对比度、那要命的色泽度、还有那大于每平方米300cd的亮度,这些都会对眼睛造成很大的伤害,并且你即使将液晶显示器的亮度和对比度调节到最低,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论