2015-04-28-OpenCV for Matlab Users (2) - cv::Mat 類的屬性和方法

我是 OpenCV 乃至 C++ 的初學者热幔,過去的兩個禮拜里剛把一個 Matlab 程序轉(zhuǎn)化成使用了 OpenCV 的 C++ 代碼靴姿,過程中遇到了很多困難塔逃。這些困難有些來源于我對 Matlab 和 OpenCV 之間語言和類庫設計差異的不了解,有些是單純的不知道 Matlab 函數(shù)的 OpenCV 對照物造成的,還有一些是由于 OpenCV 并不具有一些功能的函數(shù)镰官。我打算將這些天的所學所得寫下來,借鑒《NumPy for Matlab Users》吗货,姑且將這個系列叫作《OpenCV for Matlab Users》泳唠。這篇是這個系列的第 2 篇,因為大體結構最早完成宙搬,所以也就先出來了笨腥。整個系列的大體安排如下:

  • OpenCV for Matlab Users (1) - MATLAB 與 OpenCV / C++ 設計上的差異
  • OpenCV for Matlab Users (2) - cv::Mat 類的屬性和方法
  • OpenCV for Matlab Users (3) - MATLAB 函數(shù)的 OpenCV 對應實現(xiàn)
  • OpenCV for Matlab Users (4) - MATLAB 與 OpenCV / C++ 易搞混的語法
  • OpenCV for Matlab Users (5) - OpenCV 自身易搞混的函數(shù)辨析

下面開始本章正文:

以我淺薄的 C++ 知識來看,一個對象包括成員變量成員方法兩類勇垛,有些貌似是成員變量脖母,其實是方法,這篇先按照是成員變量還是方法分為兩類闲孤。目前成員變量只有 5 個:rows谆级,cols,dims讼积,data肥照,step,還有一些比如像 channels勤众,depth舆绎,elemSize,empty们颜,isContinuous亿蒸,size,total掌桩,type 貌似是成員變量边锁,其實是沒有參數(shù)的成員方法。

1. 成員變量

  • rows

成員變量波岛,返回矩陣的行數(shù)

    int imgRows = img.rows;
    std::cout<<"imgRows = "<<imgRows<<std::endl;

  • cols

是成員變量茅坛,返回矩陣的列數(shù)

    int imgCols = img.cols;
    std::cout<<"imgCols = "<<imgCols<<std::endl;

  • data

成員變量data事實上是指向已分配的內(nèi)存塊的指針,包括圖像數(shù)據(jù)则拷。當不存在數(shù)據(jù)時贡蓖,它被簡單設置為0.

    uchar *data = img.data;
    std::cout<<"*data = "<<(int)*data<<std::endl;
    std::cout<<"data[0] = "<<(int)data[0]<<std::endl;

  • dims

成員變量,返回一個圖像的維數(shù)煌茬,但是好奇怪斥铺,我以為會有 3 維的,結果返回的還是 2

    int imgDims = img.dims;
    std::cout<<"imgDims = "<<imgDims<<std::endl;

  • step

成員變量坛善,代表以字節(jié)為單位的圖像的行寬晾蜘,即列數(shù)(包括填補像素)邻眷,即使你的圖像元素類型不是 uchar,step 仍然帶代表著行的字節(jié)數(shù)

    int imgStep = img.step;
    std::cout<<"imgStep = "<<imgStep<<std::endl;

2. 成員方法

  • at

成員函數(shù)剔交,at(int y, int x) 可以用來存取圖像元素肆饶。 但是必須在編譯期知道圖像的數(shù)據(jù)類型,因為 cv::Mat 可以存放任意數(shù)據(jù)類型的元素岖常。所以使用 at 方法要指定數(shù)據(jù)類型驯镊,而且 at 方法本身不會進行任何數(shù)據(jù)類型轉(zhuǎn)換。

    cv::Vec3b vec3b = img.at<cv::Vec3b>(0,0);
    uchar vec3b0 = img.at<cv::Vec3b>(0,0)[0];
    uchar vec3b1 = img.at<cv::Vec3b>(0,0)[1];
    uchar vec3b2 = img.at<cv::Vec3b>(0,0)[2];
    std::cout<<"vec3b = "<<vec3b<<std::endl;
    std::cout<<"vec3b0 = "<<(int)vec3b0<<std::endl;
    std::cout<<"vec3b1 = "<<(int)vec3b1<<std::endl;
    std::cout<<"vec3b2 = "<<(int)vec3b2<<std::endl;

cv::Vec3b竭鞍,即由三個 unsigned char 組成的向量板惑。

  • channels

方法,返回通道數(shù)

    int imgChannels = img.channels();
    std::cout<<"imgChannels = "<<imgChannels<<std::endl;

  • clone

貌似也是深拷貝偎快,但是除了返回值類型不同洒放,clone 返回 cv::Mat,而 copyTo 是 void 類型滨砍,其余 clone 跟 copyTo 有什么區(qū)別我還沒搞清楚

    cv::Mat cloneMat1 = cv::Mat::ones(3,4,CV_64F);
    cv::Mat cloneMat2 = cloneMat1.clone();   
    cloneMat1.at<double>(0,0) = 0.0;
    std::cout<<"cloneMat1 = "<<cloneMat1<<std::endl;
    std::cout<<"cloneMat2 = "<<cloneMat2<<std::endl;

  • col

返回指定的一列(從 0 開始)

    cv::Mat colMat = img.col(0);
    std::cout<<"colMat.size() = "<<colMat.size()<<std::endl;

  • colRange

方法,返回若干列組成的矩陣

    cv::Mat colRangeImg = img.colRange(imgCols / 2, imgCols);
    cv::imshow("colRangeImg",colRangeImg);
    cv::waitKey();

  • convertTo

方法妖异,在縮放或不縮放的情況下轉(zhuǎn)換為另一種指定的數(shù)據(jù)類型

    cv::Mat doubleImg;
    img.convertTo(doubleImg, CV_64FC4);
    std::cout<<"doubleImg.channels() = "<<doubleImg.channels()<<std::endl;
    cv::imshow("doubleImg", doubleImg);
    cv::waitKey();

  • copyTo

把矩陣深拷貝賦值給另一個矩陣

    cv::Mat copyMat1 = cv::Mat::ones(3,4,CV_64F);
    cv::Mat copyMat2;
    copyMat1.copyTo(copyMat2);
    copyMat1.at<double>(0,0) = 0.0;
    std::cout<<"copyMat1 = "<<copyMat1<<std::endl;
    std::cout<<"copyMat2 = "<<copyMat2<<std::endl;

  • create

create 類似Mat(nrows,ncols,type [,fillValue])構造函數(shù)惋戏,把當前對象重新綁定到一個新的矩陣對象上

    cv::Mat createMat = cv::Mat::ones(3,4,CV_64F);
    createMat.create(5,6, CV_8UC(2));
    std::cout<<"createMat = "<<createMat<<std::endl;

  • cross

計算兩個 3 元素向量的叉乘積,注意他膳,必須是 3 個元素的响逢。

    cv::Mat crossVec1 = cv::Mat::ones(1,3,CV_64F);
    cv::Mat crossVec2 = cv::Mat::ones(1,3,CV_64F);
    cv::Mat crossMat  = crossVec1.cross(crossVec2);
    std::cout<<"crossMat = "<<crossMat<<std::endl;

  • depth

方法,該方法返回矩陣元素深度(每個單獨的通道類型)的標識符棕孙。

    int imgDepth = img.depth();
    std::cout<<"imgDepth = "<<imgDepth<<std::endl;

  • diag

抽取矩陣對角線上的元素舔亭,返回的是一個 min(rows,cols) * channels 的矩陣。

    cv::Mat diagMat = img.diag();
    //std::cout<<"diagMat = "<<diagMat<<std::endl;
    std::cout<<"diagMat.rows = "<<diagMat.rows<<std::endl;
    std::cout<<"diagMat.cols = "<<diagMat.cols<<std::endl;

  • dot

內(nèi)積運算蟀俊,最后返回一個 double 類型的數(shù)钦铺。兩個矩陣必須是相同大小的。如果是非單行或者非單列矩陣肢预,那么結果相當于把兩個矩陣拉成一行或者一列后做內(nèi)積矛洞。多個通道的,每個通道的內(nèi)積會被加起來烫映。

    cv::Mat onesMat1 = cv::Mat::ones(3,4,CV_64F);
    cv::Mat onesMat2 = cv::Mat::ones(3,4,CV_64F);
    double dotVal   = onesMat1.dot(onesMat2);
    std::cout<<"dotVal = "<<dotVal<<std::endl;

  • elemSize

方法沼本,返回圖像(矩陣)像素(元素)大小 (以字節(jié)為單位),因為我們這里讀入的 PNG 格式锭沟,有 4 個通道抽兆,每個通道都是 uchar 類型的,所以是返回 4 個字節(jié)族淮。

    int elementSize = img.elemSize();
    std::cout<<"elementSize = "<<elementSize<<std::endl;

  • elemSize1

方法辫红,以字節(jié)為單位返回每個矩陣元素通道的大小凭涂,結果也就是上面的 elemSize 方法得到的除以通道數(shù)。

    int elementSize1 = img.elemSize1();
    std::cout<<"elementSize1 = "<<elementSize1<<std::endl;

  • empty

方法厉熟,如果是個空矩陣导盅,則返回 true。

    bool isEmpty = img.empty();
    std::cout<<"isEmpty = "<<isEmpty<<std::endl;

  • eye

返回單位矩陣揍瑟,跟 Matlab 類似白翻,先是行數(shù),然后列數(shù)绢片,最后指定元素類型

    cv::Mat eyeMat = cv::Mat::eye(3,4,CV_64F);
    std::cout<<"eyeMat = "<<eyeMat<<std::endl;

  • isContinuous

方法滤馍,返回矩陣是否連續(xù)

    bool isContinuous = img.isContinuous();
    std::cout<<"isContinuous = "<<isContinuous<<std::endl;

  • ones

方法,產(chǎn)生全一矩陣底循,跟matlab的ones類似巢株,先是行數(shù),然后是列數(shù)熙涤,就是必須要顯式地指定數(shù)據(jù)元素(像素)類型

    cv::Mat onesMat = cv::Mat::ones(4, 3, CV_64F);
    std::cout<<"onesMat = "<<onesMat<<std::endl;

  • ptr

函數(shù)阁苞,為了簡化指針運算,ptr 函數(shù)可以得到圖像給定行的首地址祠挫。ptr 函數(shù)是一個模板函數(shù)那槽,它返回第 j 行的首地址:

    uchar *ptr = img.ptr<uchar>(0);
    std::cout<<"*ptr = "<<(int)*ptr<<std::endl;
    std::cout<<"ptr[0] = "<<(int)ptr[0]<<std::endl;

  • reshape

方法,返回一個改變了形狀的矩陣等舔,但要注意的是骚灸,跟 Matlab 不同,OpenCV 中的 reshape 的第一個參數(shù)是 通道數(shù)慌植,第二個參數(shù)是 行數(shù)甚牲,且只有這兩個參數(shù),如果想維持通道數(shù)不變蝶柿,那對應位置填 0 即可丈钙。

    cv::Mat reshapeMat1 = cv::Mat::ones(3,4,CV_64F);
    cv::Mat reshapeMat2 = reshapeMat1.reshape(0, 2);
    std::cout<<"reshapeMat1 = "<<reshapeMat1<<std::endl;
    std::cout<<"reshapeMat2 = "<<reshapeMat2<<std::endl;

  • row

方法,返回矩陣特定的某一行(行號從 0 開始)

    cv::Mat rowMat = img.row(0);
    std::cout<<"rowMat.size() = "<<rowMat.size()<<std::endl;

  • rowRange

方法交汤,取規(guī)定的行著恩,返回一個子矩陣

    int imgRows = img.rows;
    std::cout<<"imgRows = "<<imgRows<<std::endl;

  • setTo

方法,將矩陣元素都設置為某個值

    cv::Mat setMat = cv::Mat::ones(3,4,CV_64F);
    setMat.setTo(cv::Scalar(0));
    std::cout<<"setMat = "<<setMat<<std::endl;
    setMat.row(0).setTo(2);
    std::cout<<"setMat = "<<setMat<<std::endl;

  • size

方法蜻展,返回一個 cv::Size 對象喉誊,使用情形如下:

    cv::Size imgSize = img.size();
    int imgHeight = imgSize.height;
    int imgWidth  = imgSize.width;
    std::cout<<"imgSize = "<<imgSize<<std::endl;
    std::cout<<"imgHeight = "<<imgHeight<<std::endl;
    std::cout<<"imgWidth = "<<imgWidth<<std::endl;

需要注意的是,它只能返回2維的尺寸纵顾,還有就是它先返回的是列數(shù)伍茄,然后才是行數(shù),行數(shù)列數(shù)分別可以用 height 和 width 兩個成員變量得到施逾。

  • t

函數(shù)敷矫,返回當前對象的轉(zhuǎn)置矩陣

    cv::Mat tMat1 = cv::Mat::ones(3,4,CV_64F);
    tMat1.at<double>(1,2) = 0.0;
    cv::Mat tMat2 = tMat1.t();
    std::cout<<"tMat1 = "<<tMat1<<std::endl;
    std::cout<<"tMat2 = "<<tMat2<<std::endl;

  • total

方法例获,該方法返回數(shù)組元素(如果該數(shù)組表示圖像的像素數(shù))的數(shù)目,注意這個跟 Matlab 里面的 numel 可不同曹仗,Matlab 是將對象當作是矩陣(張量)來處理榨汤,只不過圖像剛好可以用矩陣和張量來表示,本質(zhì)上Matlab還是一個通用的數(shù)學軟件怎茫,而 OpenCV 是講對象當作圖像來看待收壕,是專門為圖像而設計的,所以 即使這個圖像有 RGB 3 個通道轨蛤,total 返回的也只是 height * width蜜宪,不過這也對,這就是像素數(shù)祥山。

    int imgPixels = img.total();
    std::cout<<"imgPixels = "<<imgPixels<<std::endl;

  • type

方法圃验,返回圖像像素的數(shù)據(jù)類型

    int imgType = img.type();
    std::cout<<"imgType = "<<imgType<<std::endl;

具體返回的數(shù)值對應什么類型,可以看這篇文章《LIST OF MAT TYPE IN OPENCV

  • zeros

方法缝呕,產(chǎn)生全零矩陣澳窑,跟 Matlab 的 zeros 類似,先是行數(shù)供常,然后是列數(shù)摊聋,就是必須要顯式地指定數(shù)據(jù)元素(像素)類型

    cv::Mat zerosMat = cv::Mat::zeros(4, 3, CV_64F);
    std::cout<<"zerosMat = "<<zerosMat<<std::endl;

3. 內(nèi)存管理相關

有關引用計數(shù)的一些函數(shù),作為普通用戶话侧,我們并不需要了解。

  • addref

該方法遞增與矩陣數(shù)據(jù)關聯(lián)的引用計數(shù)闯参,通常情況下瞻鹏,為避免內(nèi)存泄漏,不應顯式調(diào)用該方法鹿寨。

  • release

在必要的情況下新博,遞減引用計數(shù)并釋放該矩陣廊宪。

  • ~Mat

4. 待日后補充

下面是一些我目前還沒有用到业簿,或者在 Reference Manual 里面搜不到相關介紹的,留待日后補充:

  • adjustROI
  • AUTO_STEP
  • copySize
  • checkVector
  • CONTINUOUS_FLAG
  • SUBMATRIX_FLAG
  • allocate
  • assignTo
  • step1
  • deallocate
  • datastart
  • datalimit
  • dataend
  • flags
  • initEmpty
  • isSubmatrix
  • locateROI
  • MAGIC_VAL
  • operator cv::Matx<_Tp, m, n>
  • operator cv::Vec<_Tp, n>
  • operator_CvMat
  • operator CvMatND
  • operator IplImage
  • operator std::vector<_Tp, std::allocator><_Tp>>
  • operator()
  • operator=
  • push_back_
  • pop_back
  • refcount
  • reserve
  • mul
  • inv
  • begin
  • end

集合終止位置的迭代器态坦,但是end 方法得到的迭代器其實已經(jīng)超出了集合馏慨。這也意味著迭代過程必須在迭代器到達這個位置時結束

  • push_back

方法埂淮,如果對矩陣做,是添加行的写隶。

還有一些函數(shù)倔撞,根據(jù) Reference Manual 的應該是采用 cv::resize() 這樣的方式調(diào)用,比如
resize

最后慕趴,上述代碼整體如下:

#include <opencv2/opencv.hpp>
#include <iostream>
 
int main(int argc, char **argv)
{ 
    std::string imgPathStr("D:\\openCV_build\\doc\\opencv-logo2.png");
    cv::Mat img = cv::imread(imgPathStr,-1); // Read image
    //cv::imshow("img",img);
    //cv::waitKey();
 
    std::vector<cv::Mat> rgbImg;   
    cv::split(img,rgbImg);
    cv::Mat rgbImg_R = rgbImg[2];
    cv::Mat rgbImg_G = rgbImg[1];
    cv::Mat rgbImg_B = rgbImg[0];
 
    // Attributes
    int imgRows = img.rows;
    std::cout<<"imgRows = "<<imgRows<<std::endl;
    int imgCols = img.cols;
    std::cout<<"imgCols = "<<imgCols<<std::endl;
 
 
    // Methods
    cv::Mat rowRangeImg = img.rowRange(imgRows / 2, imgRows);
    //cv::imshow("rowRangeImg",rowRangeImg);
    //cv::waitKey();
 
    cv::Mat colRangeImg = img.colRange(imgCols / 2, imgCols);
    //cv::imshow("colRangeImg",colRangeImg);
    //cv::waitKey();
 
    cv::Size imgSize = img.size();
    int imgHeight = imgSize.height;
    int imgWidth  = imgSize.width;
    std::cout<<"imgSize = "<<imgSize<<std::endl;
    std::cout<<"imgHeight = "<<imgHeight<<std::endl;
    std::cout<<"imgWidth = "<<imgWidth<<std::endl;
 
    int imgChannels = img.channels();
    std::cout<<"imgChannels = "<<imgChannels<<std::endl;
 
    int imgType = img.type();
    std::cout<<"imgType = "<<imgType<<std::endl;
 
    int imgPixels = img.total();
    std::cout<<"imgPixels = "<<imgPixels<<std::endl;
 
    bool isContinuous = img.isContinuous();
    std::cout<<"isContinuous = "<<isContinuous<<std::endl;    
 
    int elementSize = img.elemSize();
    std::cout<<"elementSize = "<<elementSize<<std::endl;
 
    int elementSize1 = img.elemSize1();
    std::cout<<"elementSize1 = "<<elementSize1<<std::endl;
 
    int imgDepth = img.depth();
    std::cout<<"imgDepth = "<<imgDepth<<std::endl;
 
    bool isEmpty = img.empty();
    std::cout<<"isEmpty = "<<isEmpty<<std::endl;
 
    int imgDims = img.dims;
    std::cout<<"imgDims = "<<imgDims<<std::endl;
 
    cv::Mat onesMat = cv::Mat::ones(4, 3, CV_64F);
    std::cout<<"onesMat = "<<onesMat<<std::endl;
 
    cv::Mat zerosMat = cv::Mat::zeros(4, 3, CV_64F);
    std::cout<<"zerosMat = "<<zerosMat<<std::endl;
 
    int imgStep = img.step;
    std::cout<<"imgStep = "<<imgStep<<std::endl;
 
    cv::Mat doubleImg;
    img.convertTo(doubleImg, CV_64FC4);
    std::cout<<"doubleImg.channels() = "<<doubleImg.channels()<<std::endl;
    //cv::imshow("doubleImg", doubleImg);
    //cv::waitKey();
 
    cv::Mat createMat = cv::Mat::ones(3,4,CV_64F);
    createMat.create(5,6, CV_8UC(2));
    //std::cout<<"createMat = "<<createMat<<std::endl;
 
    cv::Mat copyMat1 = cv::Mat::ones(3,4,CV_64F);
    cv::Mat copyMat2;
    copyMat1.copyTo(copyMat2);
    copyMat1.at<double>(0,0) = 0.0;
    //std::cout<<"copyMat1 = "<<copyMat1<<std::endl;
    //std::cout<<"copyMat2 = "<<copyMat2<<std::endl;
 
    cv::Mat cloneMat1 = cv::Mat::ones(3,4,CV_64F);
    cv::Mat cloneMat2 = cloneMat1.clone();   
    cloneMat1.at<double>(0,0) = 0.0;
    //std::cout<<"cloneMat1 = "<<cloneMat1<<std::endl;
    //std::cout<<"cloneMat2 = "<<cloneMat2<<std::endl;
 
    cv::Mat eyeMat = cv::Mat::eye(3,4,CV_64F);
    std::cout<<"eyeMat = "<<eyeMat<<std::endl;
 
    cv::Mat diagMat = img.diag();
    //std::cout<<"diagMat = "<<diagMat<<std::endl;
    std::cout<<"diagMat.rows = "<<diagMat.rows<<std::endl;
    std::cout<<"diagMat.cols = "<<diagMat.cols<<std::endl;
 
    cv::Mat rowMat = img.row(0);
    std::cout<<"rowMat.size() = "<<rowMat.size()<<std::endl;
 
    cv::Mat colMat = img.col(0);
    std::cout<<"colMat.size() = "<<colMat.size()<<std::endl;
 
    cv::Mat onesMat1 = cv::Mat::ones(3,4,CV_64F);
    cv::Mat onesMat2 = cv::Mat::ones(3,4,CV_64F);
    double dotVal   = onesMat1.dot(onesMat2);
    std::cout<<"dotVal = "<<dotVal<<std::endl;
 
    cv::Mat crossVec1 = cv::Mat::ones(1,3,CV_64F);
    cv::Mat crossVec2 = cv::Mat::ones(1,3,CV_64F);
    cv::Mat crossMat  = crossVec1.cross(crossVec2);
    std::cout<<"crossMat = "<<crossMat<<std::endl;
 
    cv::Mat tMat1 = cv::Mat::ones(3,4,CV_64F);
    tMat1.at<double>(1,2) = 0.0;
    cv::Mat tMat2 = tMat1.t();
    std::cout<<"tMat1 = "<<tMat1<<std::endl;
    std::cout<<"tMat2 = "<<tMat2<<std::endl;
 
    cv::Mat reshapeMat1 = cv::Mat::ones(3,4,CV_64F);
    cv::Mat reshapeMat2 = reshapeMat1.reshape(0, 2);
    std::cout<<"reshapeMat1 = "<<reshapeMat1<<std::endl;
    std::cout<<"reshapeMat2 = "<<reshapeMat2<<std::endl;
 
    cv::Mat setMat = cv::Mat::ones(3,4,CV_64F);
    setMat.setTo(cv::Scalar(0));
    std::cout<<"setMat = "<<setMat<<std::endl;
    setMat.row(0).setTo(2);
    std::cout<<"setMat = "<<setMat<<std::endl;
 
    uchar *data = img.data;
    std::cout<<"*data = "<<(int)*data<<std::endl;
    std::cout<<"data[0] = "<<(int)data[0]<<std::endl;
 
    uchar *ptr = img.ptr<uchar>(0);
    std::cout<<"*ptr = "<<(int)*ptr<<std::endl;
    std::cout<<"ptr[0] = "<<(int)ptr[0]<<std::endl;
 
    cv::Vec3b vec3b = img.at<cv::Vec3b>(0,0);
    uchar vec3b0 = img.at<cv::Vec3b>(0,0)[0];
    uchar vec3b1 = img.at<cv::Vec3b>(0,0)[1];
    uchar vec3b2 = img.at<cv::Vec3b>(0,0)[2];
    std::cout<<"vec3b = "<<vec3b<<std::endl;
    std::cout<<"vec3b0 = "<<(int)vec3b0<<std::endl;
    std::cout<<"vec3b1 = "<<(int)vec3b1<<std::endl;
    std::cout<<"vec3b2 = "<<(int)vec3b2<<std::endl;
 
    std::system("PAUSE");
    return 0;
}

初寫于 2015-04-28痪蝇,未完待續(xù)鄙陡。

首發(fā)于 Yimian Dai's Homepage,轉(zhuǎn)載請注明出處躏啰。

參考資料:

OpenCV參考手冊之Mat類詳解(一)
OpenCV參考手冊之Mat類詳解(二)
OpenCV參考手冊之Mat類詳解(三)

《OpenCV 2 計算機視覺編程手冊》

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末趁矾,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子给僵,更是在濱河造成了極大的恐慌毫捣,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件想际,死亡現(xiàn)場離奇詭異培漏,居然都是意外死亡,警方通過查閱死者的電腦和手機胡本,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門牌柄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人侧甫,你說我怎么就攤上這事珊佣。” “怎么了披粟?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵咒锻,是天一觀的道長。 經(jīng)常有香客問我守屉,道長惑艇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任拇泛,我火速辦了婚禮滨巴,結果婚禮上,老公的妹妹穿的比我還像新娘俺叭。我一直安慰自己恭取,他們只是感情好,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布熄守。 她就那樣靜靜地躺著蜈垮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪裕照。 梳的紋絲不亂的頭發(fā)上攒发,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機與錄音晋南,去河邊找鬼晨继。 笑死,一個胖子當著我的面吹牛搬俊,可吹牛的內(nèi)容都是我干的紊扬。 我是一名探鬼主播蜒茄,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼餐屎!你這毒婦竟也來了檀葛?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤腹缩,失蹤者是張志新(化名)和其女友劉穎屿聋,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體藏鹊,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡润讥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了盘寡。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片楚殿。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖竿痰,靈堂內(nèi)的尸體忽然破棺而出脆粥,到底是詐尸還是另有隱情,我是刑警寧澤影涉,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布变隔,位于F島的核電站,受9級特大地震影響蟹倾,放射性物質(zhì)發(fā)生泄漏匣缘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一鲜棠、第九天 我趴在偏房一處隱蔽的房頂上張望肌厨。 院中可真熱鬧,春花似錦岔留、人聲如沸夏哭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至何址,卻和暖如春里逆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背用爪。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工原押, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人偎血。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓诸衔,卻偏偏與公主長得像盯漂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子笨农,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

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