プロが教えるわが家の防犯対策術!

vc2013  WINコンソールアプリケーション 空のプロジェクト
プロジェクト→新しい項目の追加→C++
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

#include <fstream>
#include <iostream>
#include <sstream>
#define _USE_MATH_DEFINES
#include <cmath>
#include <math.h>
#include <stdio.h>

using namespace cv;
using namespace std;

string address, csvname;
int i, swi = 0, cnt;
double pixel, CircleLevelmax;

void PAINT(Mat& grey_img, Mat& paint_img, int& i);
void PIXEL_COUNT(const Mat& gray_img, Point2f& center, float& radius, int& cnt);

int main(int argc, char *argv[])
{
double greenS, greenL, CL;
int a = 0;
Mat chan[3], src_img, findC_img, paint_img, paint1_img, gray_img, canny_img, gau_img, R_img, G_img, B_img, end_img;

ofstream ofs("C:/Users/esel/Documents/hujihara/testpicture.jpg");

switch (swi){
case 0:
{
//白黒で読み込み
gray_img = imread(address + ".JPG", 0);
imwrite(address + ".JPG", gray_img);
//カラーで読み込み
src_img = imread(address + ".JPG", 1);
//RGB分解
split(src_img, chan);
//R値画像
R_img = chan[2];
imwrite(address + ".JPG", R_img);
//R値画像ガウシアンフィルタ処理
GaussianBlur(chan[2], gau_img, Size(5, 5), 5, 5);
//Canny法
Canny(gau_img, canny_img, 50, 150, 5, true);
imwrite(address + ".JPG", gau_img);
imwrite(address + "JPG", canny_img);
//中塗りから保存まで
PAINT(canny_img, paint_img, i);

findC_img = paint_img.clone();
paint1_img = paint_img.clone();
}
break;

default:
{
//白黒で読み込み
paint_img = imread(address + ".JPG", 0);

findC_img = paint_img.clone();
paint1_img = paint_img.clone();
}
break;
}

//カラーで読み込み
end_img = imread(address + ".JPG", 1);

//輪郭の検出
vector<vector<Point> > contours1;
vector<Vec4i> hierarchy1;
//2値が憎悪,輪郭(出力),階層構造(出力),輪郭抽出モード,輪郭の近似手法
findContours(findC_img, contours1, hierarchy1, RETR_EXTERNAL, CHAIN_APPROX_NONE);

for (int j = 0; j < contours1.size(); j++)
{
//円形度
greenS = contourArea(contours1[j]);
greenL = arcLength(contours1[j], true);
if (greenL == 0){ goto FLAG; }
CL = 4.0*M_PI*greenS / (greenL*greenL);

//計測上限指定
if (CL > 0.57)
{
cnt = 0;
//撮影画像の分解能
pixel = 0.612;
//外接円の中心と半径
Point2f center;
float radius;
minEnclosingCircle(contours1[j], center, radius);

//カメラについているごみとり.ごみの座標を事前に調べておく
//if (7960 <= center.x <= 7963 && 1620 <= center.y <=1623 && 10 <= radius <= 13){ goto FLAG; }

try
{
PIXEL_COUNT(paint1_img, center, radius, cnt);
}
catch (cv::Exception& e){
goto FLAG;
}

double R_cnt = sqrt((double)cnt / M_PI);
double D_cnt = 2.0*R_cnt*pixel;
double Radi_circle = R_cnt;//描く用のpixel半径

//ファイル書き込み
ofs << D_cnt << "," << center.x << "," << center.y << endl;

double val = D_cnt;
string str = to_string(val);
//円の描写
circle(end_img, center, (int)Radi_circle, Scalar(200, 0, 0), -1, 8, 0);
int face[] = { FONT_HERSHEY_SIMPLEX };
//液滴直径の描画
putText(end_img, str, Point(center.x, center.y), face[0], 3, Scalar(200, 200, 200), 3, CV_AA);

a = a + 1;
}
FLAG:;
}
//結果書き込み
imwrite(address + ".JPG", end_img);
//液滴検出数
ofs << endl << ",num of contours," << a << endl;

return 0;
}

void PAINT(Mat& gray_img, Mat& paint_img, int& i)
{
//膨張
Mat BOUTYOU_img, SYUKU_img;
dilate(gray_img, BOUTYOU_img, Mat(), Point(-1, -1), 10);

//輪郭の検出
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
//2値画像,輪郭(出力),階層構造(出力),輪郭抽出モード,輪郭の近似手法
findContours(BOUTYOU_img, contours, hierarchy, RETR_TREE, CHAIN_APPROX_NONE);

//輪郭の描画
//画像,輪郭,描画輪郭指定インデックス,色,太さ,種類,階層構造,描画輪郭の最大レベル
drawContours(BOUTYOU_img, contours, -1, Scalar(250, 250, 250), -1, 8, hierarchy, 1);

//収縮
erode(BOUTYOU_img, paint_img, Mat(), Point(-1, -1), 10);

//保存
imwrite(address+".JPG, paint_img);
}
エラー 8 error LNK2019: 未解決の外部シンボル "void __cdecl cv::fastFree(void *)" (?fastFree@cv@@YAXPAX@Z) が関数 "public: __thiscall cv::Mat::~Mat(void)" (??1Mat@cv@@QAE@XZ) で参照されました。
                       :
上のようなエラーが合計22件発生してしまいます.
プログラミングのソースコードは前使われていたものなので動くと思うのですが,全くわかりません.

質問者からの補足コメント

  • 回答ありがとうございます.

    違うPCで使われていました.ですので動作環境の問題だとおもっているのですが全くわかりません.

    一応VC++のインクルードディレクトリに下のソースコードのエラーが出ないようにいろいろと貼り付けましたが,このことでしょうか?
    #include <opencv2/opencv.hpp>
    #include <opencv2/core/core.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    #include <opencv2/highgui/highgui.hpp>

    No.1の回答に寄せられた補足コメントです。 補足日時:2017/10/02 12:51
  • ビルド→構成マネージャー→アクティブソリューションプラットフォームをx64に書き換えるとエラーが一つになりました.
    エラー 1 error LNK2019: 未解決の外部シンボル "void __cdecl PIXEL_COUNT(class cv::Mat const &,class cv::Point_<float> &,float &,int &)" (?PIXEL_COUNT@@YAXAEBVMat@cv@@AEAV?$Point_@M@2@AEAMAEAH@Z) が関数 main で参照されました。

      補足日時:2017/10/02 13:36

A 回答 (2件)

>違うPCで使われていました



現PCにopencvはインストールしてある…んですよね?
# まぁ、ヘッダファイルがあるなら入っているんでしょう。ヘッダだけコピーした…とかでなければ。

>一応VC++のインクルードディレクトリに下のソースコードのエラーが出ないようにいろいろと貼り付けましたが,このことでしょうか?

それらのヘッダで「このソースコードじゃないけど『どっか』にこんな関数があるよ」とコンパイラに教えています。
なので、リンカが「よっしゃ、ライブラリから必要にモン持ってきて1つの実行ファイルにするで~」とやろうとしましたが…
「あんちゃん、必要なモンがないやんけ!」と言っています。
ってことで、リンカの設定にある「追加のライブラリ」にopencvのライブラリを指定する必要があります。
# 具合的なファイル名はopencv使ったことないので知りません。

「VisualStudio opencv ライブラリ」辺りで検索して下さい。
あるいは「動いていた」というPCに入っているプロジェクトの設定を参照する…とかでしょうか。
    • good
    • 0
この回答へのお礼

回答ありがとうございます.

動いていたPCは現在ないので,追加のライブラリを調べてやってみます!!

お礼日時:2017/10/02 13:10

>プログラミングのソースコードは前使われていたものなので動くと思うのですが



同じPCで動作していた。
ってことでしょうか?


で、opencvのライブラリはリンクするように設定済んでいるんですよね?
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!