OpenCV 4.0 筆記(一) 圖像視頻讀寫與顯示

OpenCV 筆記 圖像與視頻的讀寫

讀取圖片

文檔地址

imread方法

Mat imread(const String & filename ,int flags=IMREAD_COLOR);

imread讀取圖像稚铣,返回Mat對(duì)象,兩個(gè)參數(shù),第一個(gè)是文件名榛泛,支持位圖bmp蝌蹂、dib,JPEG圖像曹锨,PNG孤个,webp,pbm沛简,pgm,ppm,TIFF等多種圖像齐鲤,讀取失敗則返回空矩陣

第二個(gè)讀取方式,默認(rèn)值是1 flag = 1 返回三通道彩色圖 flag = 0 灰度圖 flag = -1 原圖帶alpha通道

如果返回三通道椒楣,編碼順序是BGR给郊。支持讀取的圖像格式如下

Currently, the following file formats are supported:

  • Windows bitmaps - *.bmp, *.dib (always supported)
  • JPEG files - *.jpeg, *.jpg, *.jpe (see the Note section)
  • JPEG 2000 files - *.jp2 (see the Note section)
  • Portable Network Graphics - *.png (see the Note section)
  • WebP - *.webp (see the Note section)
  • Portable image format - *.pbm, *.pgm, *.ppm *.pxm, *.pnm (always supported)
  • Sun rasters - *.sr, *.ras (always supported)
  • TIFF files - *.tiff, *.tif (see the Note section)
  • OpenEXR Image files - *.exr (see the Note section)
  • Radiance HDR - *.hdr, *.pic (always supported)
  • Raster and Vector geospatial data supported by GDAL (see the Note section)
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main(int argc, char **argv) {
    // 圖片路徑 可以是/或者//或者\(yùn)\或者 /、//捧灰、\\混合淆九;但不能是單獨(dú)的反斜杠 \
    Mat src = imread("C:/Users/muyi/Pictures/pic/5503.jpg");
    imshow("input", src);
    waitKey(0);
    destroyAllWindows();
    return 0;
}
import cv2
img = cv2.imread(filename,flags)  # 返回array矩陣,讀取失敗則是nonetype

圖片讀取出錯(cuò)處理

文件損壞毛俏、不存在炭庙、權(quán)限錯(cuò)誤等問題導(dǎo)致讀取圖片失敗,程序==不會(huì)報(bào)錯(cuò)==煌寇,但是返回的是空矩陣焕蹄,不處理后續(xù)使用可能會(huì)出錯(cuò)。

Mat src = imread("test.png");
if (src.empty()) {
        printf("could not load image...\n");
        return -1;
    }
src = cv2.imread("test.png")
# 斷言判斷讀取是否成功
assert type(src)==None,"load image error"
# 或者if語(yǔ)句判斷
if src.all() == None:  #
    print("load image error")

# 或者 try,自定義異常
def read_img(path):
    img = cv2.imread(path)
    if img == None:   
        raise Exception("load image error")
    return img
try :
    read_img('eee.png')
except Exception as err:
    print(err)
else:
    后續(xù)處理

讀取的圖片屬性

==C++版本阀溶,讀取圖像以Mat對(duì)象形式存儲(chǔ)腻脏,Python版本以np.array形式存儲(chǔ)==

Mat img = imread("C:\Users\muyi\Pictures\pic\5503.jpg");
// Mat類的部分屬性
cout << "dims:" << img.dims << endl; // 矩陣的維度
cout << "rows:" << img.rows << endl; // 矩陣的行數(shù)
cout << "cols:" << img.cols << endl; // 矩陣列數(shù)
cout << "channels:" << img.channels() << endl; // 圖像通道數(shù)
cout << "type:" << img.type() << endl; // 表示了矩陣中元素的類型以及矩陣的通道個(gè)數(shù)
cout << "depth:" << img.depth() << endl; // 深度
cout << "elemSize:" << img.elemSize() << endl; // 矩陣一個(gè)元素占用的字節(jié)數(shù)
cout << "elemSize1:" << img.elemSize1() << endl; //矩陣元素一個(gè)通道占用的字節(jié)數(shù)= elemSize / channels
// type為 CV_16SC3,那么elemSize = 3 * 16 / 8 = 6 bytes

圖像矩陣的type取值:參考博客
它是一系列的預(yù)定義的常量银锻,其命名規(guī)則為CV_(位數(shù))+(數(shù)據(jù)類型)+(通道數(shù))U(unsigned integer)表示的是無(wú)符號(hào)整數(shù)永品,S(signed integer)是有符號(hào)整數(shù),F(xiàn)(float)是浮點(diǎn)數(shù)击纬。 C1腐碱,C2,C3掉弛,C4則表示通道是1,2,3,4

==type一般是在創(chuàng)建Mat對(duì)象時(shí)設(shè)定==症见,如果要取得Mat的元素類型,則無(wú)需使用type殃饿,使用depth

depth 矩陣中元素的一個(gè)通道的數(shù)據(jù)類型谋作,這個(gè)值和type是相關(guān)的。例如 type為 CV_16SC2乎芳,一個(gè)2通道的16位的有符號(hào)整數(shù)遵蚜。那么帖池,depth則是CV_16S。depth也是一系列的預(yù)定義值吭净,
將type的預(yù)定義值去掉通道信息就是depth值: CV_8U CV_8S CV_16U CV_16S CV_32S CV_32F CV_64F

表1. Mat對(duì)象type的取值表

CV_8UC1 CV_8UC2 CV_8UC3 CV_8UC4
CV_8SC1 CV_8SC2 CV_8SC3 CV_8SC4
CV_16UC1 CV_16UC2 CV_16UC3 CV_16UC4
CV_16SC1 CV_16SC2 CV_16SC3 CV_16SC4
CV_32SC1 CV_32SC2 CV_32SC3 CV_32SC4
CV_32FC1 CV_32FC2 CV_32FC3 CV_32FC4
CV_64FC1 CV_64FC2 CV_64FC3 CV_64FC4
Mat img(3, 4, CV_16UC4, Scalar_<uchar>(1, 2, 3, 4));//3X4的矩陣 16位無(wú)符號(hào)4通道
//Scalar_是一個(gè)模板向量睡汹,用來(lái)初始化矩陣的每個(gè)像素,因?yàn)榫仃嚲哂?個(gè)通道寂殉,Scalar_有四個(gè)值囚巴。

python版本cv圖像格式,type(img) = numpy.ndarray 因此友扰,它具有array的一切屬性和方法彤叉,而不同于c++版本中Mat的deepth()、type()等寫法村怪。

img = cv2.imread("test.png")
print(img.shape) # [M,N,K] 行 列 通道數(shù)
print(img.size) # M*N*K
# 一些特殊方法
print(img.mean()) #平均值 img.sum() 元素和 std()標(biāo)準(zhǔn)差 等等
img = img.flatten()
img = img.ravel()
img = img.reshape()

寫入圖片

[==文檔地址==][https://docs.opencv.org/4.0.0/d4/da8/group__imgcodecs.html#gabbc7ef1aa2edfaa87772f1202d67e0ce]

imwrite方法

bool cv::imwrite(const String & filename, InputArray img , const std::vector<int>&params = std::vector<int>)

retval = cv2.imwrite(filename, img[, params])

支持寫入的圖像格式與imread一致秽浇。8位單通道或3通道BGR編碼數(shù)據(jù)才可以使用該函數(shù)。

16位無(wú)符號(hào)圖像數(shù)據(jù)甚负,可以保存為PNG, JPEG2000 和TIFF

32位浮點(diǎn)圖像數(shù)據(jù)柬焕,可以保存為TIFF,OpenEXR梭域,Radiance HDR格式

3通道32位浮點(diǎn)圖像數(shù)據(jù)被保存TIFF格式击喂,則存儲(chǔ)為高動(dòng)態(tài)范圍圖像(High-Dynamic Range,HDR)碰辅,每個(gè)像素4字節(jié)

8位帶透明度的PNG圖像保存時(shí)需要?jiǎng)?chuàng)建第四個(gè)通道,最終數(shù)據(jù)格式是BGRA

==對(duì)于非上述類型數(shù)據(jù)介时,可以通過mat.convertTo函數(shù)進(jìn)行轉(zhuǎn)換没宾,然后寫入圖像文件==

In general, only 8-bit single-channel or 3-channel (with 'BGR' channel order) images can be saved using this function

  • 16-bit unsigned (CV_16U) images can be saved in the case of PNG, JPEG 2000, and TIFF formats
  • 32-bit float (CV_32F) images can be saved in TIFF, OpenEXR, and Radiance HDR formats; 3-channel (CV_32FC3) TIFF images will be saved using the LogLuv high dynamic range encoding (4 bytes per pixel)
  • PNG images with an alpha channel can be saved using this function. To do this, create 8-bit (or 16-bit) 4-channel image BGRA, where the alpha channel goes last. Fully transparent pixels should have alpha set to 0, fully opaque pixels should have alpha set to 255/65535 (see the code sample below).

帶透明度的png圖像

c++源碼,創(chuàng)建帶透明度的PNG圖像沸柔。(出自cv文檔imwrite函數(shù)說(shuō)明)

#include <opencv2/imgcodecs.hpp>
using namespace cv;
using namespace std;
static void createAlphaMat(Mat &mat)
{
    CV_Assert(mat.channels() == 4); // 等同于c++里面的assert,條件為false返回錯(cuò)誤信息
    for (int i = 0; i < mat.rows; ++i)
    {
        for (int j = 0; j < mat.cols; ++j)
        {  // 行列遍歷進(jìn)行賦值  Vec是OpenCV定義的向量模板類
            Vec4b& bgra = mat.at<Vec4b>(i, j);
            bgra[0] = UCHAR_MAX; // Blue define UCHAR_MAX 0xff 
            bgra[1] = saturate_cast<uchar>((float (mat.cols - j)) / ((float)mat.cols) * UCHAR_MAX); // Green  saturate_cast<unchar>是一個(gè)防止顏色操作溢出的函數(shù)循衰,數(shù)據(jù)小于0置0;大于255置255
            bgra[2] = saturate_cast<uchar>((float (mat.rows - i)) / ((float)mat.rows) * UCHAR_MAX); // Red
            bgra[3] = saturate_cast<uchar>(0.5 * (bgra[1] + bgra[2])); // Alpha
        }
    }
}
int main()
{
    // Create mat with alpha channel
    Mat mat(480, 640, CV_8UC4);
    createAlphaMat(mat); // 創(chuàng)建矩陣數(shù)據(jù)
    vector<int> compression_params;
    compression_params.push_back(IMWRITE_PNG_COMPRESSION); // 枚舉值16
    compression_params.push_back(9);
    bool result = false;
    try
    {
        result = imwrite("alpha.png", mat, compression_params);
    }
    catch (const cv::Exception& ex)
    {
        fprintf(stderr, "Exception converting image to PNG format: %s\n", ex.what());
    }
    if (result)
        printf("Saved PNG file with alpha data.\n");
    else
        printf("ERROR: Can't save PNG file.\n");
    return result ? 0 : 1;
}

python實(shí)現(xiàn)

import cv2
import numpy as np
img = np.zeros((480,640,4),np.float)
def saturate(num):  ## 不清楚cv2防止顏色溢出函數(shù)褐澎,因此自定義了一個(gè)類似的函數(shù)
    if num >255.0:
        return 255.0
    if num <0.0:
        return 0.0
    else:
        return num
rows = img.shape[0]
cols = img.shape[1]
for i in range(rows):
    for j in range(cols):
        temp = img[i][j] # 像素[i][j]位置的四個(gè)通道數(shù)據(jù)
        temp[0] = 0xff
        temp[1] = saturate((cols-j)/rows*255.0)
        temp[2] = saturate((rows-j) /cols *255.0)
        temp[3] = saturate(temp[2]+temp[1])  #可以看到不同透明度会钝,顯示效果不一樣
cv2.imwrite('alpha.png',img)

效果如圖


python寫入帶透明度的png圖

讀取視頻

videoCapture結(jié)構(gòu)體,可以讀取文件視頻工三、網(wǎng)頁(yè)視頻流和攝像頭的數(shù)據(jù)迁酸。

[文檔地址][https://docs.opencv.org/4.0.0/d8/dfe/classcv_1_1VideoCapture.html#a57c0e81e83e60f36c83027dc2a188e80]

capture結(jié)構(gòu)體

函數(shù)原型 ==VideoCapture (const String &filename, int apiPreference=CAP_ANY)==

==cv2.VideoCapture(filename[, apiPreference])==

Opens a video file or a capturing device or an IP video stream for video capturing with API Preference

第一個(gè)參數(shù)是數(shù)據(jù)流或視頻路徑,第二個(gè)是API設(shè)置俭正,讀取的攝像頭編號(hào)奸鬓,默認(rèn)CAP_ANY=0,自動(dòng)檢測(cè)攝像頭。多個(gè)攝像頭時(shí)掸读,使用索引0,1,2串远,...進(jìn)行編號(hào)調(diào)用攝像頭宏多。 apiPreference = -1時(shí)單獨(dú)出現(xiàn)窗口,選取相應(yīng)編號(hào)攝像頭

通常使用 ==bool isOpened()==判斷是否打開視頻或攝像頭成功澡罚。

下一幀與釋放

cap >> frame或者 ==cap.read(frame)==讀取下一幀伸但,函數(shù)定義是CV_WRAP virtual bool read(OutputArray image);讀取幀失敗會(huì)返回布爾值false,因此可以進(jìn)行判斷

==視頻幀讀取的 read 留搔、grab 更胖、retrieve三種方式==:

retrieve速度比grab慢很多,有時(shí)可以通過grab跳過不需要的幀催式,而不需要用read解碼每一幀函喉。

  1. cap.read(frame) 結(jié)合grab和retrieve的功能,抓取下一幀并解碼
  2. cap.grap() 從設(shè)備或視頻獲取下一幀荣月,獲取成功返回true否則false
  3. cap.retrieve(frame) 在grab后使用管呵,對(duì)獲取到的幀進(jìn)行解碼,也返回true或false
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int, char**)
{
    Mat frame; //定義幀
    VideoCapture cap;
    int deviceID = 0;             // 0 = open default camera
    int apiID = cv::CAP_ANY;      // 0 = autodetect default API
    
    cap.open(deviceID + apiID);  //打開攝像頭
    // check if we succeeded
    if (!cap.isOpened()) {
        cerr << "ERROR! Unable to open camera\n";
        return -1;
    }
    //--- GRAB AND WRITE LOOP
    cout << "Start grabbing" << endl
        << "Press any key to terminate" << endl;
    for (;;)
    {
        // wait for a new frame from camera and store it into 'frame'
        cap.read(frame);  //讀取下一幀哺窄,并可以返回讀取成功與否
        //等價(jià)于 cap >> frame 同時(shí)等價(jià)于 cap.grab();cap.retrieve(frame);
        if (frame.empty()) {
            cerr << "ERROR! blank frame grabbed\n";
            break;
        }
        imshow("Live", frame);
        if (waitKey(100) >= 0)
            break;
    }
    // the camera will be deinitialized automatically in VideoCapture destructor
    return 0;
}

import cv2
cap = cv2.VideoCapture(0)
if cap.isOpened():
    while True:
        ret, prev = cap.read()  # ret是讀取狀態(tài)捐下,prev下一幀
        """
        等價(jià)于
       if cap.grab():
            ret, prev = cap.retrieve()
        """
        if ret==True:
            cv2.imshow('video', prev)
        else:
            break
        if cv2.waitKey(20)==27:
            break
cv2.destroyAllWindows()

release()在使用完后進(jìn)行手動(dòng)釋放capture對(duì)象

讀取視頻屬性 get()方法

函數(shù)原型:==double cv::VideoCapture::get(int propId)==

==retval=cv2.VideoCapture.get(propId)==

cv2.VideoCapture.get(0)     視頻文件的當(dāng)前位置(播放)以毫秒為單位
cv2.VideoCapture.get(1)     基于以0開始的被捕獲或解碼的幀索引
cv2.VideoCapture.get(2)     視頻文件的相對(duì)位置(播放):0=電影開始,1=影片的結(jié)尾萌业。
cv2.VideoCapture.get(3)     在視頻流的幀的寬度
cv2.VideoCapture.get(4)     在視頻流的幀的高度
cv2.VideoCapture.get(5)     幀速率
cv2.VideoCapture.get(6)     編解碼的4字-字符代碼
cv2.VideoCapture.get(7)     視頻文件中的幀數(shù)
cv2.VideoCapture.get(8)     返回對(duì)象的格式
cv2.VideoCapture.get(9)     返回后端特定的值坷襟,該值指示當(dāng)前捕獲模式
cv2.VideoCapture.get(10)     圖像的亮度(僅適用于照相機(jī))
cv2.VideoCapture.get(11)     圖像的對(duì)比度(僅適用于照相機(jī))
cv2.VideoCapture.get(12)     圖像的飽和度(僅適用于照相機(jī))
cv2.VideoCapture.get(13)     色調(diào)圖像(僅適用于照相機(jī))
cv2.VideoCapture.get(14)     圖像增益(僅適用于照相機(jī))(Gain在攝影中表示白平衡提升)
cv2.VideoCapture.get(15)     曝光(僅適用于照相機(jī))
cv2.VideoCapture.get(16)     指示是否應(yīng)將圖像轉(zhuǎn)換為RGB布爾標(biāo)志
cv2.VideoCapture.get(17)     × 暫時(shí)不支持
cv2.VideoCapture.get(18)     立體攝像機(jī)的矯正標(biāo)注(目前只有DC1394 v.2.x后端支持這個(gè)功能)

寫入視頻

函數(shù)文檔https://docs.opencv.org/4.0.0/dd/d9e/classcv_1_1VideoWriter.html#ad59c61d8881ba2b2da22cff5487465b5

VideoWriter類

cv::VideoWriter::VideoWriter(const String & filename,int fourcc,double fps,Size frameSize,bool  isColor = true )  // isColor

cv2.VideoWriter(filename, fourcc, fps, frameSize[, isColor])
cv.VideoWriter(filename, apiPreference, fourcc, fps, frameSize[, isColor])

寫入視頻需要指定視頻的==幀率fps== , ==幀尺寸framesize== ,==編碼格式fourcc==

framesize的大小應(yīng)該與寫入的每一幀圖像尺寸大小一致

輸出文件類型要與編碼類型一致

幾種常用視頻編解碼器

生成文件占用空間最小的編碼方式是MPEG-4.2 。在VideoWriter類的構(gòu)造函數(shù)參數(shù)為CV_FOURCC('M', 'P', '4', '2') 生年。

最大的是MPEG-1婴程,對(duì)應(yīng)在VideoWriter類的構(gòu)造函數(shù)參數(shù)為CV_FOURCC('P','I','M','1') ,所占磁盤空間是前者的5.7倍抱婉。

fourcc定義

static int cv::VideoWriter::fourcc(char c1,char c2,char c3,char c4 )
retval  =  cv2.VideoWriter_fourcc(  c1, c2, c3, c4  )
cv2.VideoWriter_fourcc('m','p','a','v') AVI或者mp4文件 
cv2.VideoWriter_fourcc('M','J','P','G') avi或者mp4 motion-jpeg編碼
cv2.VideoWriter_fourcc('P','I','M','I') MPEG-1編碼 AVI文件
cv2.VideoWriter_fourcc('X','V','I','D') MPEG-4編碼 AVI文件
cv2.VideoWriter_fourcc('T','H','E','O')  Ogg Vorbis 后綴名 ogv
cv2.VideoWriter_fourcc('F','L','V','1')  flash視頻档叔,后綴名 flv

c++創(chuàng)建writer對(duì)象和寫入圖像幀有兩種方式

#include <opencv2/opencv.hpp>
#include<opencv2/video.hpp>
using namespace cv;
using namespace std;
int main() {
    //方法1  定義對(duì)象,然后使用open方法開啟  opencv2/videoio.hpp定義了fourcc
    VideoWriter out;
    int fourcc = out.fourcc('M', 'J','P', 'G');
    out.open("video.mp4", fourcc, 30.0, cv::Size(640, 480), // 單幀圖片分辨率為 640x480
    true // 只輸入彩色圖
    );

/* 方法2  構(gòu)造函數(shù)*/  
   VideoWriter out(
       const string& filename, // 輸入文件名
        int fourcc, // 編碼形式蒸绩,
        double fps, // 輸出視頻幀率
        cv::Size frame_size, // 單幀圖片的大小
        bool is_color = true // 如果是false,可傳入灰度圖像 
    );
}

python將文件夾中所有圖片寫入視頻

import cv2
import os

im_dir = 'det'  #圖片路徑
video_dir = 'out4.avi' #輸出視頻路徑
fps = 23.977 #輸出視頻路徑
#圖片數(shù) 
num = 888
img_size = (500,300)
#fourcc = cv2.cv.CV_FOURCC('M','J','P','G')#opencv2.4
fourcc = cv2.VideoWriter_fourcc('M','J','P','G') #opencv3.0之后的寫法
videoWriter = cv2.VideoWriter(video_dir, fourcc, fps, img_size) #定義視頻寫入類

pics = os.listdir(im_dir)

for i in range(num):
    im_name = os.path.join(im_dir, str(i)+'.jpg')
    frame = cv2.imread(im_name)
    if type(frame) != None:
        videoWriter.write(frame) #寫入幀

videoWriter.release()
print ('finish')

顯示窗口Windows

可以自定義窗口顯示圖像的模式

窗口函數(shù)

[官方文檔][https://docs.opencv.org/4.0.0/d7/dfc/group__highgui.html#ggabf7d2c5625bc59ac130287f925557ac3acf621ace7a54954cbac01df27e47228f]

==函數(shù)原型== void nameWindow(const string& winname,int flags = WINDOW_AUTOSIZE) ;第一個(gè)參數(shù)是窗口名字衙四,第二個(gè)是顯示模式,flag 默認(rèn)值 是window_autosize

  1. WINDOW_AUTOSIZE 窗口大小自動(dòng)適應(yīng)圖片大小患亿,并且不可手動(dòng)更改
  2. WINDOW_NORMAL 用戶可以改變這個(gè)窗口大小
  3. WINDOW_OPENGL 窗口創(chuàng)建的時(shí)候會(huì)支持OpenGL ,且可以更改窗口大小

定義窗口名稱传蹈,imshow時(shí)可以指定讓圖像在該窗口顯示

namedWindow("input", WINDOW_AUTOSIZE);
imshow("input", src);

cv2.namedWindow("input", cv2.WINDOW_AUTOSIZE)
cv2.imshow("input", src)

一個(gè)窗口顯示多張圖片

另一種方法是matplotlib

OpenCV一個(gè)窗口只能顯示一張圖片。但可以通過組合多張圖步藕,實(shí)現(xiàn)多張圖在一個(gè)窗口的視覺效果惦界。

Python numpy組合

用np.hstack或者np.vstack組合矩陣 ==若是要讓各個(gè)圖片之間顯示間隔,可以插入0或255的列做間隔==

#圖1
img = cv2.imread(r'C:\Users\muyi\Pictures\pic\489321.jpg')
#圖2
img2 = cv2.imread(r'C:\Users\muyi\Pictures\pic\489323.jpg')
#拼接
imgs = np.hstack([img,img2])
#展示多個(gè)
cv2.imshow("mutil_pic", imgs)
#等待關(guān)閉
cv2.waitKey(0)

顯示多個(gè)圖片

==OpenCV一個(gè)窗口顯示多個(gè)圖片的注意事項(xiàng)==:

讀入的多個(gè)圖片必須具有==相同的尺寸咙冗、通道數(shù)==表锻。若是彩圖、灰度圖同時(shí)顯示乞娄,會(huì)出現(xiàn)窗口黑屏現(xiàn)象

matplotlib劃分窗口顯示多張圖:

利用 plt.subplot(m,n,k)劃分窗口即可瞬逊,類似matlab的繪圖显歧,而且各個(gè)窗口可以顯示不同格式的圖像

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市确镊,隨后出現(xiàn)的幾起案子士骤,更是在濱河造成了極大的恐慌,老刑警劉巖蕾域,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拷肌,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡旨巷,警方通過查閱死者的電腦和手機(jī)巨缘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)采呐,“玉大人若锁,你說(shuō)我怎么就攤上這事「拢” “怎么了又固?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)煤率。 經(jīng)常有香客問我仰冠,道長(zhǎng),這世上最難降的妖魔是什么蝶糯? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任洋只,我火速辦了婚禮,結(jié)果婚禮上昼捍,老公的妹妹穿的比我還像新娘识虚。我一直安慰自己,他們只是感情好端三,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鹃彻,像睡著了一般郊闯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蛛株,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天团赁,我揣著相機(jī)與錄音,去河邊找鬼谨履。 笑死欢摄,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的笋粟。 我是一名探鬼主播怀挠,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼析蝴,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了绿淋?” 一聲冷哼從身側(cè)響起闷畸,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吞滞,沒想到半個(gè)月后佑菩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡裁赠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年殿漠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片佩捞。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡绞幌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出失尖,到底是詐尸還是另有隱情啊奄,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布掀潮,位于F島的核電站菇夸,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏仪吧。R本人自食惡果不足惜庄新,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望薯鼠。 院中可真熱鬧择诈,春花似錦、人聲如沸出皇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)郊艘。三九已至荷科,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間纱注,已是汗流浹背畏浆。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留狞贱,地道東北人刻获。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像瞎嬉,于是被迫代替她去往敵國(guó)和親蝎毡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子厚柳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容